2015-09-04 2 views
1

Мне интересно, как установить столбец nchar в null с оператором обновления. Я нашел это: NULL value for int in Update statementКак установить NCHAR в null с оператором обновления (C# sqlcommand)

, в котором говорится, что вы должны использовать для установки не-int полей в NULL.

Так что я попытался следующие:

commandText = 
    @"UPDATE Brukere 
     SET Engangskode = CAST(NULL AS NCHAR) 
    WHERE Navn = @navn AND Mobilnr = @mobilnr"; 

Однако, когда я исполню это все равно не будет обновлять столбец NULL. Неужели я ошибаюсь, или это что-то еще? Любая помощь будет оценена :)

Долгий код надрез при необходимости: http://pastebin.com/8auKuk6Q

+4

Нет необходимости в каких-либо забросов - просто используйте 'UPDATE Brukere SET Engangskode = NULL WHERE Navn = @navn AND Mobilnr = @ mobilnr'. Это должно работать ** просто отлично **, если столбец фактически разрешает 'NULL' ... –

+0

@marc_s См. Ответ на Михай ниже. Также не знаете, почему вы отредактировали это. Я получаю, что вы предпочитаете форматирование, но это не формат моего исходного кода. – user2875994

+1

Ответ, который говорит _ по умолчанию в SQL Server, NULL является INT_, неверен. – juharr

ответ

2

Проблема в том, что вы устанавливаете локальную переменную commandText в инструкцию обновления вместо command.CommandText. Измените его следующим образом:

command.CommandText = "UPDATE Brukere SET Engangskode=NULL WHERE [email protected] AND [email protected]"; 

И я думаю, что оно будет работать с литьем или без него.

+0

Я просто сделал это после изменения строки: 'command.CommandText = commandText;' Как уже упоминалось выше, я думал, что это по ссылке, а не по значению. Спасибо за вашу помощь. – user2875994

+0

Поцарапайте опорный бит. – user2875994

+0

Это по ссылке. Вы устанавливаете ссылку 'commandText' на новую строку. Это не влияет на другие ссылки. И поскольку 'string' неизменен, вы не можете изменить объект, на который они ссылаются. – juharr

0

Нет необходимости бросить. Juse set column = null. НЕТ котировок, тo!

+0

Нет результатов кастинга в том же, к сожалению. Это то, что я пробовал изначально. Наверное, я должен был упомянуть. – user2875994

+0

Тогда либо где отфильтровывается все строки, либо определение столбца не допускает нулей. –

+0

Если вы посмотрите на большой фрагмент кода, я использую тот же самый поиск WHERE ранее в коде, и там он найдет правильную строку. Поэтому фильтрация должна быть правильной. И столбец разрешает NULL – user2875994

2

Я бы рекомендовал НЕ «вновь использовать» SqlCommand в вашем примере - создать новый, определенную команду для UPDATE заявления, что-то вроде этого:

using (SqlConnection con = new SqlConnection(connectionString)) 
{ 
    con.Open(); 

    string bruker = Request.Cookies["Navn"].Value; 
    string mobilnr = Request.Cookies["Mobilnr"].Value; 

    string commandText = "SELECT Engangskode FROM Brukere WHERE [email protected] AND [email protected]"; 

    bool correctCode = false; 

    try 
    { 
     using (SqlCommand command = new SqlCommand(commandText, con)) 
     { 
      ..... 

      if (correctCode) 
      { 
       // DO NOT "reuse" the previous SqlCommand - create a new, specific one! 
       string updateQuery = "UPDATE Brukere SET Engangskode = NULL WHERE Navn = @navn AND Mobilnr = @mobilnr;"; 

       using (SqlCommand updateCmd = new SqlCommand(updateQuery, con) 
       { 
        updateCmd.Parameters.Add("@navn", SqlDbType.NVarChar, 20).Value = bruker; 
        updateCmd.Parameters.Add("@mobilnr", SqlDbType.NChar, 10).Value = mobilnr; 

        updateCmd.ExecuteNonQuery(); 

        Response.Redirect("Kvittering.aspx", false); 
       } 
      } 
     }          
    } 
    catch(....) 
    { 
     ....... 
    } 
}    
+0

Повторное использование работает отлично. См. Мой ответ на Юхарра выше :) Имейте upvote, хотя. – user2875994

Смежные вопросы