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

时间:2015-08-18 21:31:39

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

app.get('/jquery/jquery.js', function(req, res) { res.sendfile(__dirname + '/node_modules/jquery/dist/jquery.min.js'); }); 程序中,我试图将参数添加到我在远程服务器(plex)上创建的存储过程的SQL语句中。

ShippedContainerSettlement

当我使用参数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); 并为其赋值时,会引发错误。但是,当我运行程序,并为endDate添加参数时,它运行正常吗?

我得到的错误是:

enter image description here

任何想法我做错了。

修改 我已经纳入了下面提到的一些变化。这是我使用的代码。

@startDate

但是,当我收到此错误时,它似乎没有收到我发送的参数。

enter image description here

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

并在此处添加参数:

enter image description here

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

使用SqlCommand而不是odbc。

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

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