有幾個SQL服務器有存儲過程,例如Microsoft SQL Server或PostgreSQL。還有一些實現存儲過程調用的客戶端對象(Delphi中的TADOStoredProc
,.NET Framework中的SqlCommand
等)。是否從文本字符串執行存儲過程?
我一直想問的問題是:
存儲與它們的參數的二進制表示在特別有效的方式始終執行的程序,或者是一個代表存儲過程參數始終轉換爲普通超高級對象文本字符串和存儲過程始終通過將此純文本字符串發送到SQL服務器來執行? (讓我們以一種技術爲例 - 讓它成爲SQL Server和ADO.NET)。
我注意到,對ADO.NET過程的參數名稱沒有任何意義 - 只有他們的創作順序很重要,這讓我想用純文本字符串的想法。
更新@Alex K.
我測試過下面的.NET代碼:
CREATE PROCEDURE paramtest
@par1 nvarchar(50),
@par2 nvarchar(50),
@par3 nvarchar(50)
AS
SELECT Res = '@par1 = ' + @par1 + '; @par2 = ' + @par2 + '; @par3 = ' + @par3
RETURN 555
using System;
using System.Data.SqlClient;
using System.Data;
namespace SqlParamTest
{
class Program
{
private static void addParam(SqlCommand cmd, string parameterName, ParameterDirection direction, SqlDbType dbType, int size, object value)
{
SqlParameter par = new SqlParameter(parameterName, dbType, size);
par.Direction = direction;
par.Value = value;
cmd.Parameters.Add(par);
}
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection(@"Data Source=localhost\sqlexpress;Initial Catalog=test;Integrated Security=True"))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "paramtest";
addParam(cmd, "@par3", ParameterDirection.Input, SqlDbType.NVarChar, 50, "third");
addParam(cmd, "@par2", ParameterDirection.Input, SqlDbType.NVarChar, 50, "second");
addParam(cmd, "@par1", ParameterDirection.Input, SqlDbType.NVarChar, 50, "first");
addParam(cmd, "@Return", ParameterDirection.ReturnValue, SqlDbType.Int, 0, null);
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (rdr.Read()) Console.WriteLine((string)rdr["Res"]);
rdr.Close();
Console.WriteLine("Return value: {0}", cmd.Parameters["@Return"].Value);
}
Console.ReadKey();
}
}
}
,是的,它保持在一個正確的方法參數,但我認爲,.NET是增加了額外的參數檢查,因爲在Delphi中的代碼如下:
procedure TMyClass.Test(Conn: TADOConnection);
var SP:TADOStoredProc;
begin
SP := TADOStoredProc.Create(nil);
try
SP.Connection := Conn;
SP.ProcedureName := 'paramtest';
SP.Parameters.CreateParameter('@whatthehell', ftString, pdInput, 50, 'one');
SP.Parameters.CreateParameter('@AnotherCrap', ftString, pdInput, 50, 'two');
SP.Parameters.CreateParameter('?', ftString, pdInput, 50, 'three');
SP.ExecProc;
finally
SP.Free;
end;
end;
回報:
@par1 = one; @par2 = two; @par3 = three
,不抱怨缺少的參數。
pdReturnValue僅在該參數在任何其他參數之前創建時纔有效。
Alex,我已經更新了有關參數順序的問題。 – Paul 2013-04-29 14:04:25
更新了上述內容。 – 2013-04-29 15:30:28