我得到了“;必须声明标量变量“”@Val1”";使用C#插入记录时出错

本文关键字:quot 出错 使用 @Val1 插入 记录 变量 标量 声明 | 更新日期: 2023-09-27 17:58:40

当我运行以下代码时

        if (NewButtonClicked == true) {
            string sql = "SELECT MAX(location_id)+1 FROM locations";
            OdbcCommand my_odbc_cmd = new OdbcCommand(sql, my_odbc_connection);
            OdbcDataReader my_data_reader;
            int new_id = 0;
            my_data_reader = my_odbc_cmd.ExecuteReader();
            if (my_data_reader.HasRows) 
            {
                my_data_reader.Read();
                new_id = (int)my_data_reader[0];
            }
            my_data_reader.Close();
            textBoxLocationID.Text = new_id.ToString();
            sql = "INSERT INTO locations (location_id,location,latitude,longitude,city,"
                + "state_province,country,continent) VALUES (@Val1,'@Val2',@Val3,@Val4,'@Val5','@Val6','@Val7','@Val8')";
            my_odbc_cmd.Connection = my_odbc_connection;
            my_odbc_cmd.CommandText = sql;
            my_odbc_cmd.Parameters.AddWithValue("@Val1", new_id);
            my_odbc_cmd.Parameters.AddWithValue("@Val2", textBoxName.Text);
            my_odbc_cmd.Parameters.AddWithValue("@Val3", textBoxLatitude.Text);
            my_odbc_cmd.Parameters.AddWithValue("@Val4", textBoxLongitude.Text);
            my_odbc_cmd.Parameters.AddWithValue("@Val5", textBoxCity.Text);
            my_odbc_cmd.Parameters.AddWithValue("@Val6", textBoxState_Province.Text);
            my_odbc_cmd.Parameters.AddWithValue("@Val7", textBoxCountry.Text);
            my_odbc_cmd.Parameters.AddWithValue("@Val8", textBoxContinent.Text);
            my_odbc_cmd.CommandType = CommandType.Text;
            my_odbc_cmd.ExecuteNonQuery();
        }

当执行到达时,它给了我"必须声明标量变量"@Val1"

my_odbc_cmd.ExecuteNonQuery();

我该如何解决这个错误。有人能帮我吗?后端使用的数据库是SQL Server 2008 R2。我正在使用ODBC连接连接到数据库。

我得到了“;必须声明标量变量“”@Val1”";使用C#插入记录时出错

这可能意味着new_id就是null。不发送值为null的参数。你需要通过DBNull.Value。疯狂但真实。

my_odbc_cmd.Parameters.AddWithValue("@Val1", ((object)new_id) ?? DBNull.Value);

此外:'@Val2'(和类似的)是非常错误的。几乎可以肯定,你的意思只是@Val2,没有引号。

根据MSDN页面"配置参数和参数数据类型"上的"使用参数占位符"部分,Odbc数据源仅支持通过查询文本中的?的位置参数,而不支持仅由SqlClient支持的命名参数(如@Val1)。

此外,正如Marc Gravell所指出的,您不应该在查询中引用参数。

尝试将SQL更改为:

sql = "INSERT INTO locations (location_id,location,latitude,longitude,city,"
            + "state_province,country,continent) VALUES (?,?,?,?,?,?,?,?)";
相关文章: