C# 带参数的ASP.NET ODBC查询

C# 带参数的ASP.NET ODBC查询,c#,asp.net,sql,odbc,C#,Asp.net,Sql,Odbc,请帮帮我,我不知道以下代码有什么问题: OdbcConnection conn = new OdbcConnection(connString); String query = "INSERT INTO customer (custId, custName, custPass, "+ "custEmail, custAddress, custAge) VALUES (" +

请帮帮我,我不知道以下代码有什么问题:

        OdbcConnection conn = new OdbcConnection(connString);
        String query = "INSERT INTO customer (custId, custName, custPass, "+
                       "custEmail, custAddress, custAge) VALUES (" +
                       "@ID, @Name, @Pass, @Email, @Address, @Age)";

        OdbcCommand exe = new OdbcCommand(query, conn);
        exe.Parameters.Add("@ID", OdbcType.UniqueIdentifier).Value = id;
        exe.Parameters.Add("@Name", OdbcType.VarChar).Value = name;
        exe.Parameters.Add("@Pass", OdbcType.VarChar).Value = pass;
        exe.Parameters.Add("@Email", OdbcType.VarChar).Value = email;
        exe.Parameters.Add("@Address", OdbcType.VarChar).Value = address;
        exe.Parameters.Add("@Age", OdbcType.Int).Value = age;
        conn.Open();
        exe.ExecuteNonQuery(); // ERROR [07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 6. 
这段代码抛出的参数太少。尝试执行查询时出错。数据库很好,当我将值硬编码到查询中而不是使用参数时,它工作正常


谢谢。

您的查询中有一列不存在。
请检查您的列名

当您在SQL语句中拼写错误列名时,通常会看到这一点。您确定这些列名是custId、custName等吗?

尝试将pass更改为passw,可能它与asp标识符混淆了…

来自MSDN:

当CommandType设置为Text时,.NET Framework ODBC数据提供程序不支持将命名参数传递给SQL语句或OdbcCommand调用的存储过程。在这两种情况下,请使用问号占位符。例如:

将查询重写为

OdbcConnection conn = new OdbcConnection(connString);
    String query = "INSERT INTO customer (custId, custName, custPass, "+
                   "custEmail, custAddress, custAge) VALUES (" +
                   "?, ?, ?, ?, ?, ?)";
参数计数的顺序

编辑:可以通过以下方式添加参数:

OdbcCommand exe = new OdbcCommand(query, conn);
exe.Parameters.Add("ID", OdbcType.UniqueIdentifier).Value = id;
exe.Parameters.Add("Name", OdbcType.VarChar).Value = name;
exe.Parameters.Add("Pass", OdbcType.VarChar).Value = pass;
exe.Parameters.Add("Email", OdbcType.VarChar).Value = email;
exe.Parameters.Add("Address", OdbcType.VarChar).Value = address;
exe.Parameters.Add("Age", OdbcType.Int).Value = age;

尝试将pass更改为passw,可能它和asp标识符混淆了……我非常确定,因为若我将查询的第三行更改为实际值,它就可以正常工作。使用ODBC到FilMaker,这种语法在.NET环境中非常有效,参数的顺序是正确的!如果查询参数没有命名,parameters.Add中的第一个参数有什么用途?@Scott:其他数据提供程序正在使用命名参数。因此,我想原因是要有相同的API,您可能仍然希望使用名称,以便可以查找参数,为后续调用设置参数。我还没有在OdbcCommand中尝试过,但它们对其他数据库提供程序很有用。
OdbcCommand exe = new OdbcCommand(query, conn);
exe.Parameters.Add("ID", OdbcType.UniqueIdentifier).Value = id;
exe.Parameters.Add("Name", OdbcType.VarChar).Value = name;
exe.Parameters.Add("Pass", OdbcType.VarChar).Value = pass;
exe.Parameters.Add("Email", OdbcType.VarChar).Value = email;
exe.Parameters.Add("Address", OdbcType.VarChar).Value = address;
exe.Parameters.Add("Age", OdbcType.Int).Value = age;