2017-01-09 13 views
0

C#から入力された値がNULLでない場合、テーブルTBL_Logの列を更新したいとします。ここに私のストアドプロシージャがあります:値が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

あなたの質問は不明です。 C#で提供された '@ End'値が' null'でない場合、列 'End'が' NULL'で '@end'になるすべての行を更新したいのですか?パラメータは独立しています。つまり、 '@ Start'は' @ End'または 'End'に関係なく' Start'が 'NULL'の行だけに影響しますか? – HABO

+0

あなたの質問への回答ではなく、読んでおくべき記事。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

答えて

3

これは、nullでない値のみを更新します。値が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

終了日時は20171006で、型はchar(8) – RedArmy

+2

です。@AkharinBazdid、@Pid_Bazdid、および'@ C_Bazdid'は変数や入力パラメータとして与えられたサンプルプロシージャのどこにも定義されていないようです。私たちはこれがOPからの不完全なスニペットだと思っていますか?何か不足していますか? – 3N1GM4

+0

Gordon Linoffさん、仕事ではありません。更新はありません。たとえば、@start = 20170910と他の値がnullです。他の時刻は更新のための2つの値に入力され、その他の値はNULLです。 – RedArmy

1

.Netコードを表示する必要があります。おそらく、チェックを追加する最も良い場所は.NETにあり、気になる値がNULLの場合はストアドプロシージャを呼び出さないでください。

また、あなたが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 

パラメータのいずれかを更新することなく、nullの場合、ストアドプロシージャの終了することテーブル

与えられたC#コードでは、値がnullのときにストアドプロシージャを呼び出すことも、例外をスローすることもできます。また、日付値には文字列の代わりにDateTimeを使用することを検討する必要があります。あなたのC#コードで次の操作を行うことができます

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

好ましく

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

あなたも、個別に各パラメータをチェックして、有意義なを与えるために、例外をパラメータとしてその名を渡すことができますエラーメッセージ。

+0

私は例えば:@start = 20170910としたい、他の値はnullです。他の時刻は更新のための2つの値に入力され、その他の値はNULLです。 – RedArmy

+0

あなたのために送信する#.net code – RedArmy

+0

C#の回答が追加されました – Juan

関連する問題