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

时间:2014-01-21 16:21:32

标签: .net vb.net oledb oledbcommand oledbexception

在Web服务中遇到以下代码问题。已经找到了解决方案,但我所看到的任何内容似乎与我在下面所做的不同。

NB:字符串变量' 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

4 个答案:

答案 0 :(得分:5)

令人遗憾的是,前两个StackOverflow目前在谷歌搜索涉及

的搜索结果
Parameter ?_ has no default value

两个人都有提问者回来并说他们的原始问题或他们的测试数据或其他内容存在缺陷(尽管提问者重新检查它们是否很棒)。

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

  

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

     

您需要传递DBNull.Value来传递语义null。对于   例如:

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

答案 1 :(得分:0)

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

您还可以确保使用

获取字符串

AccountNo.ToString()

答案 2 :(得分:0)

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

SQL查询的语法是正确的,并且正确插入了参数。但是,测试数据包含错误,因此正确格式化的查询不会返回任何结果。

感谢大家的投入。

答案 3 :(得分:-1)

重复: OleDbCommand parameters order and priority

  

OLE DB .NET提供程序不支持传递的命名参数   SQL语句或由a调用的存储过程的参数   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