C#SQLCommand不会将数据写入db

Koh*_*rik 2 c# sql

我有以下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)

我错过了什么吗?

Son*_*nül 5

我认为您需要在每个创建命令的字符串末尾添加一个空格.

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)及其大小.