ExecuteCommand возвращает -1, но обновляет запись - PullRequest
0 голосов
/ 28 июня 2011

Это мое заявление об обновлении, построенное так:

StringBuilder queryUpdate = new StringBuilder();
queryUpdate.AppendFormat("UPDATE TPMdailydata SET FISBTranIntvairmet={0},FISBTranIntvmetr={1},FISBTranIntvnexradnational = {2} ", svd.Data[1].SecPerUpdate.ToString("0.0"), svd.Data[2].SecPerUpdate.ToString("0.0"), svd.Data[3].SecPerUpdate.ToString("0.0"));
queryUpdate.AppendFormat(",FISBTranIntvnexradregional = {0},FISBTranIntvnotam = {1},FISBTranIntvoutage = {2} ", svd.Data[4].SecPerUpdate.ToString("0.0"), svd.Data[5].SecPerUpdate.ToString("0.0"), svd.Data[7].SecPerUpdate.ToString("0.0"));
queryUpdate.AppendFormat(",FISBTranIntvpirep = {0},FISBTranIntvsigmet = {1},FISBTranIntvSUA = {2} ", svd.Data[8].SecPerUpdate.ToString("0.0"), svd.Data[9].SecPerUpdate.ToString("0.0"), svd.Data[10].SecPerUpdate.ToString("0.0"));
queryUpdate.AppendFormat(",FISBTranIntvTAF = {0},FISBTranIntvTISB = {1},FISBTranIntvwind = {2}, AirportID = '{3}' ", svd.Data[11].SecPerUpdate.ToString("0.0"), svd.Data[12].SecPerUpdate.ToString("0.0"), svd.Data[13].SecPerUpdate.ToString("0.0"), des);
queryUpdate.AppendFormat("where SVID = {0} and reportdate = '{Z}' ", (int)svd.ID, rptdate.ToShortDateString());
queryUpdate.AppendFormat("and siteID = '{0}'", siteID);
string cmd = queryUpdate.ToString();

Исполнено:

rowsreturned = this.dba.ExecuteCommand(cmd);

Записано в консоль так:

Console.WriteLine(string.Format("cmd-{0}",cmd)); //+ "and siteID = '{0}'",siteID
Console.WriteLine(String.Format("Number of rows updated: {0} UPDATE FISB Data: report date {1} svid {2} ", rowsreturned, rptdate, svd.ID));

результат выглядит следующим образом:

CMD-ОБНОВЛЕНИЕ TPMdailydata SET FISBTranIntvairmet = 124,8, FISBTranIntvmetr = 252,0, FISBTranIntvnexradnational = 905,4, FISBTranIntvnexradregional = 150,6, FISBTranIntvnotam = 248,5, FISBTranIntvoutage = 0,0, FISBTranIntvpirep = 494,8, FISBTranIntvsigmet = 123,8, FISBTranIntvSUA = 551,8, FISBTranIntvTAF = 553,7, FISBTranIntvTISB = 13.3, FISBTranIntvwind = 554.1, AirportID = 'ZDC', где SVID = 158 и reportdate = '20.06.2011' и siteID = 'DEV' Количество обновленных строк: -1 ОБНОВЛЕНИЕ FISB Данные: дата отчета 20.06.2011, 12:00:00, свидание 158

Обновление определенно работает, но я ожидал возвращаемого значения для количества обновленных строк. Я получаю -1. Я думаю, что это плохо. Я не могу найти информацию о том, что означает -1. Кому-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Вам нужно параметризовать свой код и добавить параметры в строку, а не пытаться ориентироваться в спагетти, описанном выше. Даже если вы не хотите делать это для удобства обслуживания, вы исключите вероятность внедрения SQL.

Что касается твоего -1, я не уверен почему. Есть много вещей, которые вы могли бы установить, чтобы достичь этого. То, что я бы попробовал, это уйти от LINQ, так как нет никаких оснований для выполнения этого запроса через объекты LINQ. Вот шаблон, который вызывает команду SQL напрямую, а не через уровни неявного FUD:

        string connString = "{Connection string here}";
        string sql = "{SQL Query Here}";

        using(SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();

            using(SqlCommand cmd = new SqlCommand(sql, conn))
            {
                int numRows = cmd.ExecuteNonQuery();
            }
        }

ДОБАВЛЕНО: Чтобы попробовать приведенную выше методологию, без создания SQL-соединения, измените это:

rowsreturned = this.dba.ExecuteCommand(cmd); 

к этому

        SqlConnection conn = (SqlConnection) dba.Connection;
        using(SqlCommand cmd = new SqlCommand(queryUpdate, conn))
        {
            rowsreturned = cmd.ExecuteNonQuery();
        }

Это извлекает контекст, который у вас уже есть, и вы можете увидеть, если rowReturned все еще представляет проблему. Если это так, проверьте строку команды и рассмотрите возможность ее запуска непосредственно в SQL Studio.

0 голосов
/ 28 июня 2011

Иногда базы данных имеют параметры, которые не отправляют количество обновленных записей.

Например, для SQL Server, если это выполняется в хранимой процедуре:

SET NOCOUNT ON

Тогда полученные записи всегда будут возвращать -1.

Возможно, есть некоторыетакая опция либо с базой данных, либо с провайдером, который предотвращает количество возвращаемых записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...