2017-01-09 2 views
0

Я хочу обновить любые столбцы таблицы TBL_Log, если значение, введенное с C#, не NULL. Вот моя хранимая процедура:Как обновить столбцы, если значение не равно NULL

Alter PROCEDURE [dbo].[SP_Update_User] 
(@User_id as int,@User_Names as nvarchar(max),@End as char(8),@Start as nvarchar(max) ,@Count as int) 

AS 
BEGIN 


UPDATE [dbo].[TBL_Log] 


    SET User_Names = @User_Names 
     ,[Start] = @start 
     ,[End] = @End 
     ,[Count] = @Count 
     where User_id = @User_id 



END 

Я попытался выполнить эту работу, но не был успешным.

код в классе D1:

public static DataSet Update_User(int @User_id, string @User_Names, string @End, string @Start, int @Count) 
    { 

     SqlConnection myConnection = new SqlConnection(strConecctionString); 


     SqlDataAdapter sqlcmd = new SqlDataAdapter("SP_Update_UserData_Bot", myConnection); 
     sqlcmd.SelectCommand.CommandType = CommandType.StoredProcedure; 


     SqlParameter parameterID_category_ID = new SqlParameter("@User_id", SqlDbType.Int); 
     parameterID_category_ID.Value = User_id; 
     sqlcmd.SelectCommand.Parameters.Add(parameterID_category_ID); 

     SqlParameter parameterID_Part_ID = new SqlParameter("@User_Names", SqlDbType.Int); 
     parameterID_Part_ID.Value = User_Names; 
     sqlcmd.SelectCommand.Parameters.Add(parameterID_Part_ID); 


     SqlParameter parameterID_Series_ID = new SqlParameter("@End", SqlDbType.Char); 
     parameterID_Series_ID.Value = End; 
     sqlcmd.SelectCommand.Parameters.Add(parameterID_Series_ID); 

     SqlParameter parameterID_Model_ID = new SqlParameter("@start", SqlDbType.NVarChar); 
     parameterID_Model_ID.Value = start; 
     sqlcmd.SelectCommand.Parameters.Add(parameterID_Model_ID); 

     SqlParameter parameterID_Count = new SqlParameter("@Count", SqlDbType.Int); 
     parameterID_Count.Value = Count; 
     sqlcmd.SelectCommand.Parameters.Add(parameterID_Count); 


     sqlcmd.SelectCommand.CommandTimeout = int.MaxValue; 
     DataSet DS = new DataSet(); 
     sqlcmd.Fill(DS); 


     return DS; 

    } 
+0

Ваш вопрос непонятен. Вы говорите, что если значение '@ End', заданное в C#, не' null ', вы хотите обновить все строки, где столбец 'End' равен' NULL' '@ End', и аналогично для всех остальных параметров? Параметры независимы, т. Е. '@ Start' влияет только на строки, где' Start' является 'NULL', независимо от' @ End' или 'End'? – HABO

+0

Не ответ на ваш вопрос, а статья, которую вы должны прочитать. http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

ответ

3

Это обновит только значения, которые не равны нулю. Если значение равно null, столбец обновляется до собственного значения.

UPDATE [dbo].[TBL_Log] 
SET User_Names = isnull(@User_Names, User_Names) 
    , [Start] = isnull(@start, [Start]) 
    , [End] = isnull(@End, [End]) 
    , [Count] = isnull(@Count, [Count]) 
where User_id = @User_id 
0

Ваш закомментирована логика прекрасно:

UPDATE [dbo].[TBL_Log] 
    SET User_Names = @User_Names, 
     [Start] = @start, 
     [End] = @End, 
     [Count] = @Count 
     where User_id = @User_id and 
      (@User_Names is not null and 
      @AkharinBazdid is not null and 
      @Pid_Bazdid IS NOT NULL and 
      @C_Bazdid IS NOT NULL 
      ); 

Вы также можете использовать IF, если вы предпочитаете.

Примечание:

  • Не используйте ключевые слова SQL и зарезервированные слова в качестве имен столбцов. Управляющие персонажи просто мешают.
  • Если start и end - дата/время, тогда используйте подходящие типы. Не используйте строки.
+0

end is date time 20171006 и type is char (8) – RedArmy

+2

Что мы принимаем в отношении таких переменных, как '@ AkharinBazdid',' @ Pid_Bazdid' и '@ C_Bazdid', поскольку они не отображаются нигде в данной процедуре выборки как переменные или входящие параметры?Мы считаем, что это всего лишь неполный фрагмент из OP, или я что-то упускаю? – 3N1GM4

+0

Gordon Linoff, не работает, нет обновления, потому что, может быть, я хочу, например: @start = 20170910, а другое значение равно null. и в другое время вводится 2 значения для обновления, а другое значение равно null. – RedArmy

1

Вы должны показать свой .Net-код. Вероятно, лучшее место для добавления проверки - в .NET и не вызывайте хранимую процедуру, если значение, о котором вы беспокоитесь, равно NULL.

Также необходимо указать, какое значение не должно быть пустым, но если предположить, вы имели в виду любой из них вы можете сделать:

IF (@User_Names IS NULL OR @start IS NULL OR @End IS NULL OR @Count IS NULL OR @User_Id IS NULL) 
BEGIN 
    RETURN 
END 

Это будет выход из хранимой процедуры, если какой-либо из параметров нуль без обновления таблица

С учетом кода C# вы можете либо не вызывать хранимую процедуру, когда значение равно null, либо генерирует исключение. Также вы должны использовать DateTime вместо строки для значений даты.

Вы можете сделать следующее в вашем C# код:

if (@User_Names == null || @End == null || @Start == null) 
    return; 

Или предпочтительно

if (@User_Names == null || @End == null || @Start == null) 
    throw new ArgumentNullException(); 

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

+0

Я хочу, например: @start = 20170910, а другое значение равно null. и в другое время вводится 2 значения для обновления, а другое значение равно null. – RedArmy

+0

отправить для u C# .net код – RedArmy

+0

C# ответ добавлен – Juan