是否可以使用C#中的SqlCommand
向SQL查询添加静态参数?
我正在尝试根据客户是否已经存在来INSERT
或UPDATE
数据库表。
如果要执行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
{
....
}
}
对此事的任何帮助,将不胜感激。
答案 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{
....
}
}