C# 我得到的是;必须声明标量变量"@Val1"&引用;使用C插入记录时出错#
当我运行以下代码时C# 我得到的是;必须声明标量变量"@Val1"&引用;使用C插入记录时出错#,c#,ado.net,odbc,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;
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连接连接到数据库。这可能意味着
new\u id
为null
。不发送值为null
的参数。您需要传递DBNull.Value
。疯狂但真实
my_odbc_cmd.Parameters.AddWithValue("@Val1", ((object)new_id) ?? DBNull.Value);
另外:
“@Val2”
(以及类似的)是非常错误的。几乎可以肯定,您的意思是没有引号的@Val2
。这可能意味着new\u id
是null
。不发送值为null
的参数。您需要传递DBNull.Value
。疯狂但真实
my_odbc_cmd.Parameters.AddWithValue("@Val1", ((object)new_id) ?? DBNull.Value);
另外:“@Val2”
(以及类似的)是非常错误的。几乎可以肯定,您的意思只是@Val2
,没有引号。根据MSDN页面上的“使用参数占位符”部分,Odbc
数据源只支持通过查询文本中的?
定位参数,而不支持命名参数(例如@Val1
),仅由SqlClient
支持
此外,正如Marc Gravell所指出的,您不应该在查询中引用参数
尝试将SQL更改为:
sql = "INSERT INTO locations (location_id,location,latitude,longitude,city,"
+ "state_province,country,continent) VALUES (?,?,?,?,?,?,?,?)";
根据MSDN页面上的“使用参数占位符”部分,Odbc
数据源仅通过查询文本中的?
支持位置参数,而不支持仅由SqlClient
支持的命名参数(如@Val1
)
此外,正如Marc Gravell所指出的,您不应该在查询中引用参数
尝试将SQL更改为:
sql = "INSERT INTO locations (location_id,location,latitude,longitude,city,"
+ "state_province,country,continent) VALUES (?,?,?,?,?,?,?,?)";
请使用您正在使用的适当数据库系统重新标记您的问题…新id的值是多少?我已经编辑了上面的代码,请看新id是什么?请使用您正在使用的适当数据库系统重新标记您的问题…新id的值是多少?我已经编辑了上面的代码,请看下面的代码新的id是?+1表示疯狂,顺便说一句,你为什么要对一个对象施法?我总是做
new\u id??DbNull.Value
或者它有什么关系吗?@Silvermind,因为我看不出新的\u id
是如何声明的。如果它被声明为对象
,那么是:新的\u id??DBNull.Value
可以。如果声明为int?
,则您建议的内容将无法编译(运算符“??”不能应用于“int”和“System.DBNull”类型的操作数
)。我的建议会的。然而,我将用更简单的东西来更新——中间立场。现在更快乐了?我并不是想要一个更简单的方法,我的快乐状态可能会更高一些,但我只是诚实地犯了一个错误,因为我整天都在同一个环境中与许多弱者打交道;)感谢您的回复。+1表示疯狂,顺便说一句,您为什么要向对象施法?我总是做new\u id??DbNull.Value
或者它有什么关系吗?@Silvermind,因为我看不出新的\u id
是如何声明的。如果它被声明为对象
,那么是:新的\u id??DBNull.Value
可以。如果声明为int?
,则您建议的内容将无法编译(运算符“??”不能应用于“int”和“System.DBNull”类型的操作数
)。我的建议会的。然而,我将用更简单的东西来更新——中间立场。现在更快乐了?我并不是想要一个更简单的方法,我的快乐状态可能会更高一些,但我只是诚实地犯了一个错误,因为我整天都在同一个环境中与许多弱者打交道;)感谢您的回复。我如何为参数赋值?您当前添加参数的方式应该可以,但是?
与参数的关系取决于它们在查询中出现的顺序(因此第一个?
从添加的第一个参数中获取其值,以此类推)如何为参数赋值?当前添加参数的方式应该可以,但是?
与参数的关系取决于它们在查询中出现的顺序(因此第一个?
从添加的第一个参数中获取其值,以此类推)