Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我得到的是;必须声明标量变量"@Val1"&引用;使用C插入记录时出错#_C#_Ado.net_Odbc - Fatal编程技术网

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”类型的操作数
)。我的建议会的。然而,我将用更简单的东西来更新——中间立场。现在更快乐了?我并不是想要一个更简单的方法,我的快乐状态可能会更高一些,但我只是诚实地犯了一个错误,因为我整天都在同一个环境中与许多弱者打交道;)感谢您的回复。我如何为参数赋值?您当前添加参数的方式应该可以,但是
与参数的关系取决于它们在查询中出现的顺序(因此第一个
从添加的第一个参数中获取其值,以此类推)如何为参数赋值?当前添加参数的方式应该可以,但是
与参数的关系取决于它们在查询中出现的顺序(因此第一个
从添加的第一个参数中获取其值,以此类推)