向存储过程调用添加参数时出错

Error when adding parameters to stored procedure call

ShippedContainerSettlement 程序中,我试图将参数添加到我在远程服务器 (plex) 上创建的存储过程的 SQL 语句中。

public void checkGradedSerials()
{
    localTable = "Graded_Serials";

    List<string> gradedHides = new List<string>();

    string queryString = "call sproc164407_2053096_650214('@startDate', '" + endDate + "');";
    OdbcDataAdapter adapter = new OdbcDataAdapter();

    OdbcCommand command = new OdbcCommand(queryString, connection);
    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.AddWithValue("@startDate", startDate);
    adapter.SelectCommand = command;

    connection.Open();

    while (rowsCollected == false)
    {
       if (retries <= 5)
       {
          try
          {
              DataTable table = new DataTable();
              adapter.Fill(table);

当我使用参数 @startDate 并为其赋值时抛出错误。但是,当我 运行 程序,并添加我为 endDate 所做的参数时,它 运行 没问题吗?

我返回的错误是:

任何想法我做错了什么。

编辑: 我已经合并了下面提到的一些更改。这是我使用的代码。

public void checkGradedSerials()
        {
            localTable = "Graded_Serials";
            List<string> gradedHides = new List<string>();
            OdbcCommand command = new OdbcCommand("sproc164407_2053096_650214", odbcConnection);
            command.CommandType = CommandType.StoredProcedure;

            command.Parameters.AddWithValue("@startDate", startDate);
            command.Parameters.AddWithValue("@endDate", endDate);

            OdbcDataAdapter adapter = new OdbcDataAdapter();
            adapter.SelectCommand = command;
            odbcConnection.Open();

            while (rowsCollected == false)
            {
                if (retries <= 5)
                {
                    try
                    {
                        DataTable table = new DataTable();
                        adapter.Fill(table);

但是它似乎没有收到我发送的参数,因为我收到了这个错误。

这是我正在使用的存储过程。这可能看起来很奇怪,但请记住,当我只是将一个字符串传递给 select 命令时,这是有效的(请参阅上面第一个代码示例中的 endDate)。

SELECT  DISTINCT(Serial_No)
FROM    Part_v_Container_Change2 AS CC
WHERE   CC.Change_Date > @Change_Start_Date AND 
        CC.Change_Date <= @Change_End_Date AND
        CC.Location = 'H Grading';

并在此处添加参数:

你应该使用 System.Data.SqlClient。您可以显式声明要发送的参数的数据类型...像这样:

SqlConnection cn;

cn = new SqlConnection(ConnectionString);
SqlCommand cmd;
cmd = new SqlCommand("sproc164407_2053096_650214", cn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@startDate", SqlDbType.DateTime);
cmd.Parameters["@startDate"].Value = startDate;

cmd.Parameters.Add("@enddate", SqlDbType.VarChar);
cmd.Parameters["@enddate"].Value = enddate;

如果必须使用 ODBC,则必须使用不支持命名参数的 ODBC CALL 语法。因此,将 queryString 行更改为:

string queryString = "{call sproc164407_2053096_650214 (?, ?)}";

然后你可以添加你的参数:

command.Parameters.Add("@startDate", OdbcType.DateTime).Value=startDate;
command.Parameters.Add("@endDate", OdbcType.DateTime).Value=endDate;

使用 SqlCommand 而不是 odbc。

只需将存储的过程名称放在 CommandText 中,而不是 SQL 语句来执行它。添加参数值意味着适配器将以正确的格式传递参数。您不需要在 CommandText 中进行字符串操作。

如果您需要使用 OdbcCommand,请参阅 this answer 表明您需要对参数使用 ? 语法,因此可以将您的 CommandText 改回包括 'call' 或 'exec' 命令和参数占位符,然后确保 AddWithValue 参数顺序正确