向存储过程调用添加参数时出错
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
参数顺序正确
在 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
参数顺序正确