【问题标题】:Executed Stored Procedure using Dapper使用 Dapper 执行存储过程
【发布时间】:2014-07-07 18:04:55
【问题描述】:

我正在尝试使用 Dapper 执行存储过程,但出现两种类型的错误:

  1. 解析第 9 列时出错(fTaxInvoiceNumber=INV0000000028PPN - 字符串)
  2. 对象引用未设置为对象的实例

这是执行存储过程的代码:

SqlConnection db = new SqlConnection(ConnectionFactory.ConnectionString("RebateSystem"));
db.Open();

try
{
    var result = db.Query<PracticeRebateOrders>("GetPracticeRebateOrderByInvoiceNumber", new
    {
       TaxInvoiceNumber = InvoiceNumber
    }, commandType: CommandType.StoredProcedure).FirstOrDefault();
    db.Close();
    db.Dispose();

    return result;
}
catch (Exception ex)
{
   throw;
}

这是我的存储过程:

ALTER PROCEDURE [dbo].[GetPracticeRebateOrderByInvoiceNumber] 
    @TaxInvoiceNumber NVARCHAR(20)
AS
BEGIN
   SELECT TOP(1) 
      [fPracticeRebateOrdersID]
      ,[fPracticeID]
      ,[fPracticeUserID]
      ,[fCreatedDate]
      ,[fInvoiceInCredits]
      ,[fPurchaseDate]
      ,[fPracticeRebateOrderStatusID]
      ,[fRebatePaymentRunID]
      ,[fRebateBatchID]
      ,[fTaxInvoiceNumber]
   FROM 
      [PracticeRebateSystem].[dbo].[PracticeRebateOrders]
   WHERE 
      fTaxInvoiceNumber = @TaxInvoiceNumber
END

【问题讨论】:

  • 你能展示一下PracticeRebateOrders 的样子吗?或者至少fTaxInvoiceNumber 看起来像什么?另外-关于“对象引用未设置为对象的实例”-究竟是什么时候发生的?这是否可能仅仅是因为没有行,因此resultnull?作为旁注,您的try/catch 没有用,您应该在这里使用using,而不是try - 即using(var db = new SqlConnection(...)) {...}。请注意,如果您使用using,则不需要Close() / Dispose(),因此您只需return db.Query&lt;...&gt;(...).FirstOrDefault();
  • fTaxInvoiceNumber 看起来像这样 - INV0120000028PPN。错误发生在我执行存储过程的地方。 var result = db.Query("GetPracticeRebateOrderByInvoiceNumber", new { TaxInvoiceNumber = InvoiceNumber }, commandType: CommandType.StoredProcedure).FirstOrDefault(); .好的,我会注意的,谢谢
  • 不,你误会我了;我在问你的PracticeRebateOrders 类上的属性 fTaxInvoiceNumber 是什么样的。不是价值是什么;但是什么是成员声明.
  • 对不起,它看起来像这样: public string fTaxInvoiceNumber ; [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string TaxInvoiceNumber { get { return fTaxInvoiceNumber; } 设置 { fTaxInvoiceNumber = 值; } }
  • 嗯;这很奇怪——应该可以正常工作;我可以在这里使用任何 .StackTrace 信息吗?

标签: sql-server dapper


【解决方案1】:

不是真正的答案,但基于问题中可用的代码和我有这个的 cmets...它工作正常且成功...

public void SO24605346_ProcsAndStrings()
{
    connection.Execute(@"create proc #GetPracticeRebateOrderByInvoiceNumber @TaxInvoiceNumber nvarchar(20) as
        select @TaxInvoiceNumber as [fTaxInvoiceNumber]");
    string InvoiceNumber = "INV0000000028PPN";
    var result = connection.Query<PracticeRebateOrders>("#GetPracticeRebateOrderByInvoiceNumber", new
    {
        TaxInvoiceNumber = InvoiceNumber
    }, commandType: CommandType.StoredProcedure).FirstOrDefault();

    result.TaxInvoiceNumber.IsEqualTo("INV0000000028PPN");
}
class PracticeRebateOrders
{
    public string fTaxInvoiceNumber;
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string TaxInvoiceNumber { get { return fTaxInvoiceNumber; } set { fTaxInvoiceNumber = value; } }
}

我很乐意提供帮助,但我无法重现问题。这里看起来不错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    相关资源
    最近更新 更多