如何使用SqlCommand C#将静态参数添加到SQL查询

时间:2019-02-22 02:34:04

标签: c# sql if-statement

是否可以使用C#中的SqlCommand向SQL查询添加静态参数?

我正在尝试根据客户是否已经存在来INSERTUPDATE数据库表。

如果要执行UpdateType,我将使INSERT = 1,如果要执行UPDATE,则使2。

是否可以删除INSERT或UPDATE查询的动态参数@UpdateType和仅静态值1或2?

以下是查询示例:

string sqlQuery = "IF NOT EXISTS(SELECT 1 FROM Client WHERE [ClientID] =" +  
    "@ClientID) " +  
    "INSERT INTO Client (ClientId, LastName, FirstName, UpdateType)" + 
    "VALUES (@ClientID, @LastName, @FirstName, @UpdateType)" +
    "ELSE " +  
    "UPDATE Client " + 
    "SET [ClientID] = @ClientID, [LastName] = @LastName, [FirstName] = "+ 
    "@FirstName, [UpdateType] = @UpdateType"+
    "WHERE ClientID = ClientID;";

using (SqlCommand MyCommand = new SqlCommand(sqlQuery, SQLConn))
{
    MyCommand.Parameters.Add("@ClientID", SqlDbType.VarChar);
    MyCommand.Parameters.Add("@LastName", SqlDbType.VarChar);
    MyCommand.Parameters.Add("@FirstName", SqlDbType.VarChar);
    MyCommand.Parameters.Add("@UpdateType", SqlDbType.Int);

    try
    {
        SQLConn.Open();

        foreach (DataRow row in SourceData.Rows)
        {
            MyCommand.Parameters["@ClientID"].Value = row["ClientId"].ToString();
            MyCommand.Parameters["LastName"].Value = row["LastName"].ToString();
            MyCommand.Parameters["@FirstName"].Value = row["FirstName"].ToString();
            MyCommand.Parameters["@UpdateType"].Value = Convert.ToInt32(row["UpdateType"]);

            MyCommand.ExecuteNonQuery();
        }
     }
     catch
     {
         ....
     }    
}

对此事的任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

是的,只需从sql中删除@UpdateType并将其替换为1或2

...
"(@ClientID, @LastName, @FirstName, 1)" +
"ELSE " +  
"UPDATE Client " + 
"SET [ClientID] = @ClientID, [LastName] = @LastName, [FirstName] = "+ 
"@FirstName, [UpdateType] = 2"+
...

删除同样提及的其余代码:

MyCommand.Parameters.Add("@UpdateType", SqlDbType.Int);

还有

MyCommand.Parameters["@UpdateType"].Value = Convert.ToInt32(row["UpdateType"]);

PS-在c#中使用@字符串可让您在字符串常量中插入新行,从而使其更具可读性:

var sql = @"select *
  from
    Table
  where
    Blah = 1";

比到处都有那个“ +”。您也许应该将sql字符串放入资源文件或类似文件中。或存储过程

答案 1 :(得分:0)

通过使用带有@符号的多行字符串,可以使代码更简洁。

如果记录不存在,则将其插入,否则对其进行更新,从而在ClientId = @ClientId的情况下设置该记录的值。

您当然不希望执行查询正在执行的操作。实际上,使用where子句WHERE ClientId = ClientId更新表将更新表中的每一行。

        string sqlQuery = @"
IF NOT EXISTS(SELECT 1 FROM Client WHERE [ClientID] = @ClientID)
BEGIN
    INSERT INTO Client (ClientId, LastName, FirstName, UpdateType)
    VALUES (@ClientID, @LastName, @FirstName, 1)
END
ELSE
BEGIN
    UPDATE Client SET 
        [LastName] = @LastName,
        [FirstName] = @FirstName,
        [UpdateType] = 2
    WHERE
        ClientID = @ClientID;//<<<fix your query!!!!!
END;"

using (SqlCommand MyCommand = new SqlCommand(sqlQuery, SQLConn))
{
    MyCommand.Parameters.Add("@ClientID", SqlDbType.VarChar);
    MyCommand.Parameters.Add("@LastName", SqlDbType.VarChar);
    MyCommand.Parameters.Add("@FirstName", SqlDbType.VarChar);

    try{
        SQLConn.Open();
        foreach (DataRow row in SourceData.Rows)
        {
            MyCommand.Parameters["@ClientID"].Value = row["ClientId"].ToString();
            MyCommand.Parameters["@LastName"].Value = row["LastName"].ToString();
            MyCommand.Parameters["@FirstName"].Value = row["FirstName"].ToString();
        }
     }catch{
         ....
     }    
}