我有以下SQL语句(如果我在我的数据库中执行它,它会起作用):
IF EXISTS (SELECT * FROM dbo.PopularityPokemon WHERE Dex_ID = '445')
UPDATE dbo.PopularityPokemon SET TimesPicked = TimesPicked + 1
ELSE
INSERT into dbo.PopularityPokemon (Dex_ID, TimesPicked)VALUES('445', 1);
Run Code Online (Sandbox Code Playgroud)
我现在需要从代码隐藏中做到这一点.
我有以下两个参数:
private const int _pickCount = 1;
string dexID
Run Code Online (Sandbox Code Playgroud)
dexID是给我调用的函数的参数.
使用新连接并打开它来执行标准过程可以正常工作,但使用SQLCommand时可能会出现语法错误:
try
{
using (myConnection)
{
using (SqlCommand command = new SqlCommand())
{
command.Connection = myConnection;
command.CommandType = CommandType.Text;
command.CommandText = "IF EXISTS (SELECT * FROM dbo.PopularityPokemon WHERE Dex_ID = @Dex_ID) UPDATE dbo.PopularityPokemon SET TimesPicked = TimesPicked + @PickCount"
+ "ELSE"
+ "INSERT into dbo.PopularityPokemon (Dex_ID, TimesPicked)"
+ "VALUES(@Dex_ID, @PickCount)";
command.Parameters.AddWithValue("@Dex_ID", dexID);
command.Parameters.AddWithValue("@PickCount", _pickCount);
command.ExecuteNonQuery();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我认为您需要在每个创建命令的字符串末尾添加一个空格.
command.CommandText = "IF EXISTS (SELECT * FROM dbo.PopularityPokemon WHERE Dex_ID = @Dex_ID) UPDATE dbo.PopularityPokemon SET TimesPicked = TimesPicked + @PickCount "
+ "ELSE "
+ "INSERT into dbo.PopularityPokemon (Dex_ID, TimesPicked) "
+ "VALUES(@Dex_ID, @PickCount)";
Run Code Online (Sandbox Code Playgroud)
或者使用逐字字符串文字作为;
command.CommandText = @"IF EXISTS (SELECT * FROM dbo.PopularityPokemon WHERE Dex_ID = @Dex_ID) UPDATE dbo.PopularityPokemon SET TimesPicked = TimesPicked + @PickCount
ELSE
INSERT into dbo.PopularityPokemon (Dex_ID, TimesPicked)
VALUES(@Dex_ID, @PickCount)";
Run Code Online (Sandbox Code Playgroud)
也不要AddWithValue尽可能多地使用.有时它可能会产生意想不到的惊人结果.使用Add方法重载来指定参数类型(SqlDbType)及其大小.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |