ExecuteReader 时出现“参数 ?_1 没有默认值”错误

Posted

技术标签:

【中文标题】ExecuteReader 时出现“参数 ?_1 没有默认值”错误【英文标题】:"Parameter ?_1 has no default value" error when ExecuteReader 【发布时间】:2014-01-21 16:21:32 【问题描述】:

Web 服务中的以下代码有问题。已经寻找解决方案,但我所看到的似乎与我在下面所做的没有什么不同。

注意:字符串变量“AccountNo”被传递到包含以下代码的函数中。

错误是在最后一行代码——ExecuteReader上产生的。

    Dim sConnString As String
    Dim rdr As OleDbDataReader
    Dim orderPaid As Decimal
    Dim fbeused As Decimal

    sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\orders.mdb'"

    Dim conn As New OleDbConnection(sConnString)

    Dim sb As New StringBuilder
    sb.Append("SELECT DISTINCTROW OrderHeaders.Accountno, Sum(([paidqty]*[unitprice])*[orderheaders].[entpercent]/100) AS orderpaid, Sum([freeqty]*[unitprice]) AS fbeused")
    sb.Append(" FROM OrderHeaders INNER JOIN OrderDetails ON OrderHeaders.[OrderNo] = OrderDetails.[OrderNo]")
    sb.Append(" GROUP BY OrderHeaders.Accountno HAVING OrderHeaders.Accountno=?")
    Dim sqlString As String = sb.ToString

    Dim cmd As New OleDbCommand(sqlString, conn)
    cmd.CommandType = CommandType.Text
    'cmd.Parameters.AddWithValue("AccNo", AccountNo)
    cmd.Parameters.Add("AccNo", OleDbType.VarWChar).Value = AccountNo
    conn.Open()

    rdr = cmd.ExecuteReader()

我得到的错误是(如上所述)

Parameter ?_1 has no default value

【问题讨论】:

OleDbCommand parameters order and priority 的可能重复项 【参考方案1】:

很遗憾,目前在 Google 中搜索的前两个 *** 结果涉及

Parameter ?_ has no default value

两人都让提问者回来并说他们的原始问题或他们的测试数据或其他任何东西存在缺陷(尽管提问者回来检查很好)。

Marc Gravell here 提供了此错误的解释(在正常情况下遇到):

.Value 为 null 的参数不会被传递。完全没有。

您需要传递 DBNull.Value 来传递语义空值。为了 示例:

com.Parameters.Add("@p7", OleDbType.Char, 255).Value =
         ((object)values7[0]) ?? DBNull.Value; (etc)

【讨论】:

【参考方案2】:

“?”看起来正确作为添加到命令的参数的参数占位符。您当前将参数标识为 OleDbType.VarWChar。这是故意的吗?你在处理 unicode 数据吗?我怀疑在这种情况下不会。尝试更改为 OleDbType.Char,它也被表示为处理 System.String 值。

您还可以使用

确保您得到一个字符串

AccountNo.ToString()

【讨论】:

事实上它是正确的。令人烦恼的是,这个问题是由测试数据中的错误引起的。非常令人沮丧。无论如何感谢您的意见。【参考方案3】:

这个问题实际上有一个错误的假设,那就是代码中存在错误。

SQL 查询的语法正确,参数插入正确。然而,测试数据包含错误,因此格式正确的查询没有返回任何结果。

感谢大家的意见。

【讨论】:

【参考方案4】:

复制: OleDbCommand parameters order and priority

OLE DB .NET 提供程序不支持传递命名参数 SQL 语句或存储过程的参数 当 CommandType 设置为 Text 时的 OleDbCommand。在这种情况下, 必须使用问号 (?) 占位符。例如:

// Create SQL with ? for each parameter
String sql = "SELECT Address FROM Adresses WHERE Country = ? AND City = ?";
OleDbCommand command = new OleDbCommand(sql , connection);

// Add to command each paramater VALUE by position. 
// One parameter value for ?
command.Parameters.Add("My City") ;
command.Parameters.Add("My Country") ;

http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx

【讨论】:

这就是我正在做的事情

以上是关于ExecuteReader 时出现“参数 ?_1 没有默认值”错误的主要内容,如果未能解决你的问题,请参考以下文章

.net SqlCommand.ExecuteReader 是不是关闭连接?

来自 objComm.ExecuteReader 的 DataReader

ExecuteReader()获得数据

ExecuteReader 需要打开的连接

ExecuteReader 需要打开连接。当前状态:破碎

SQLDataReader 在 ExecuteReader 之后读取为空