我在 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 语句的最佳实践是什么?