当我运行以下代码时
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连接来连接数据库。
答案 0 :(得分:4)
这可能意味着new_id
为null
。不会发送值为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 (?,?,?,?,?,?,?,?)";