1

我在 Sybase AdoNet 驱动程序中发现了一个有趣的东西。我无法用它正确执行动态 sql 语句。

我有一个非常小的存储过程:

CREATE PROCEDURE
    GetCustomerByName
    @customerFirstName nvarchar(50),
    @customerLastName nvarchar(50),
    @intParameter int AS
    /* Adaptive Server has expanded all '*' elements in the following statement */ 
    SELECT
        Customer.Id,
        Customer.FirstName,
        Customer.LastName
    FROM
        Customer
    WHERE
        FirstName = @customerFirstName
        AND LastName = @customerLastName

我想针对这个存储过程执行动态 sql 语句:

using (var aseConnection = new AseConnection(SybaseConnectionString))
using (var aseCommand = aseConnection.CreateCommand())
{
    aseConnection.Open();

    aseCommand.CommandText = @"
        execute GetCustomerByName
            @customerFirstName = ?,
            @customerLastName = ?,
            @intParameter = 1";

    aseCommand.CommandType = CommandType.Text;
    aseCommand.Parameters.Add(0, "John");
    aseCommand.Parameters.Add(1, "Doe");

    using (var dataReader = aseCommand.ExecuteReader())
    {
        while (dataReader.Read())
        {
            Console.WriteLine(
                "Id: {0} - First Name: {1} - Last Name: {2}",
                dataReader.GetInt32(0),
                dataReader.GetString(1),
                dataReader.GetString(2));
        }
    }
}

但不幸的是,我得到了一个例外:

Sybase.Data.AseClient.AseException was unhandled
  HResult=-2146233087
  Message=Must declare variable '@dr_ta0'.

  Source=Sybase.AdoNet2.AseClient
  StackTrace:
       at Sybase.Data.AseClient1.AseCommand.CheckResult(Int32 res)
       at Sybase.Data.AseClient1.AseCommand.Execute(CommandBehavior commandBehavior)
       at Sybase.Data.AseClient1.AseCommand._ExecuteReader(CommandBehavior commandBehavior)
       at Sybase.Data.AseClient1.AseCommand.ExecuteReader()
       at Sybase.Data.AseClient.AseCommand.ExecuteReader()
       at AseCommandTest.Program.Main(String[] args) in c:\Users\jkanczler\Documents\Visual Studio 2012\Projects\AseCommandTest\AseCommandTest\Program.cs:line 61
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

正如我所见,Sybase 不能很好地支持传递给 AseCommand 的参数。那么使用 AseCommand 执行动态 sql 语句的最佳实践是什么?

4

0 回答 0