【问题标题】:Error when adding parameters to stored procedure call向存储过程调用添加参数时出错
【发布时间】:2015-08-18 21:31:39
【问题描述】:

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);

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

这是我正在使用的存储过程。这可能看起来很奇怪,但请记住,当我简单地将字符串传递给选择命令时,这是有效的(参见上面第一个代码示例中的 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';

并在此处添加参数:

【问题讨论】:

  • @Change_Start_Date 来自哪里?你能告诉我们存储过程吗?另外,如果这是您标记的 sql server,为什么要使用 ODBC 而不是本机 sql server 提供程序?
  • 我需要 odbc 连接来连接它。这是这样做的唯一方法。 Change_Start_Date 是我使用 startDate 从中选择值的列的名称。
  • 我很困惑,如果你的存储过程中的参数是@Change_Start_Date@Change_End_Date,你为什么要设置@startDate@endDate?你能显示整个 sproc (CREATE PROCEDURE ...) 而不仅仅是 select 语句吗?
  • 这就是你添加它的方式。这就是为什么我说它可能看起来很奇怪。这只是他们使用的系统。如果我将参数更改为 @change_Start_Date 它没有区别。
  • 很抱歉,如果没有更多信息,我无法帮助您。

标签: c# sql-server stored-procedures parameters


【解决方案1】:

您应该使用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;

【讨论】:

  • 我需要使用 ODBC 连接,因为这是他们唯一的连接方法?是否可以通过 ODBC 连接来做到这一点?
  • 这个模型也应该适用于 ODBC 连接。只需在您的 queryString 中发送存储过程名称并创建两个参数。
  • 嗨,Brian,它似乎没有通过参数。我在上面编辑了我的问题,以反映新的变化和发生了什么。感谢您的帮助。
  • 啊...我没有意识到 ODBC 不接受命名参数。我已经更新了我的答案。
【解决方案2】:

使用 SqlCommand 代替 odbc。

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

如果您需要使用 OdbcCommand,请参阅 this answer 显示您需要对参数使用 ? 语法,因此可以将您的 CommandText 改回包含“call”或“exec”命令和参数占位符,然后制作确定你AddWithValue参数的顺序是正确的

【讨论】:

  • Rory 我很想看到你给我举个例子?
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 2019-03-17
相关资源
最近更新 更多