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

时间:2014-04-15 18:59:21

标签: c# ado.net odbc

当我运行以下代码时

        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连接来连接数据库。

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

根据"使用参数占位符"在MSDN页面Configuring Parameters and Parameter Data Types上的部分,Odbc数据源仅支持查询文本中?的位置参数,命名参数(例如@Val1 }),仅由SqlClient支持。

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

尝试将SQL更改为:

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