[英]Returning multiple values from a SQL Server stored procedure
我想做的是使用我的spLogin
存儲過程從同一個表中返回兩個值,我想將它們都保存在C#的會話中。
這是桌子
create table tbClients
(
ClientID int primary key identity(0,1),
ClientFirstName varchar(20),
ClientLastName varchar(20),
ClientAddress varchar(60),
ClientOrigin varchar(20),
ClientUsername varchar(20),
ClientPassword int,
ClientSecurity int
)
當客戶端單擊登錄按鈕時,我要編寫一個過程,該過程將檢查用戶是否有效,用戶的安全級別以及用戶的名字。
這是我到目前為止的
create procedure spLogin(
@ClientUsername varchar(20),
@ClientPassword int
)
AS BEGIN
DECLARE @Security int
DECLARE @ClientFirstName varchar(20)
IF EXISTS (SELECT * FROM tbClients
WHERE ClientUsername = @ClientUsername
AND ClientPassword = @ClientPassword)
BEGIN
SELECT
@Security = ClientSecurity,
@ClientFirstName = ClientFirstName
FROM tbClients
WHERE
ClientUsername = @ClientUsername
AND ClientPassword = @ClientPassword
IF(@Security = 1)
BEGIN
SELECT 'Admin' as Security, @ClientFirstName
END
ELSE
BEGIN
SELECT 'Customer' as Security, @ClientFirstName
END
END
ELSE
BEGIN
SELECT 'INVALID'
END
END
GO
不知道這是否行得通,因為我不確定如何在不使用數據集的情況下將這些值存儲在C#中,到目前為止似乎還行不通?
我會像這樣寫這個程序有點不同.....
create procedure spLogin
@ClientUsername varchar(20)
,@ClientPassword int
,@Security VARCHAR(10) OUTPUT
,@ClientFirstName varchar(20) OUTPUT
,@ValidLogin INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (SELECT * FROM tbClients
WHERE ClientUsername = @ClientUsername
AND ClientPassword = @ClientPassword)
BEGIN
SELECT @ValidLogin = 1
,@Security = CASE WHEN ClientSecurity = 1
THEN 'Admin' ELSE 'Customer' END
,@ClientFirstName = ClientFirstName
FROM tbClients
WHERE ClientUsername = @ClientUsername
AND ClientPassword = @ClientPassword
END
ELSE
BEGIN
SET @ValidLogin = 0;
END
END
GO
不是C#的專家,但是您可以在C#中處理類似...的輸出參數。
// define connection and command, in using blocks to ensure disposal
using(SqlConnection conn = new SqlConnection(pvConnectionString ))
using(SqlCommand cmd = new SqlCommand("dbo.spLogin", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
// set up the input parameters
cmd.Parameters.Add("@ClientUsername", SqlDbType.VarChar, 20);
cmd.Parameters.Add("@ClientPassword", SqlDbType.Int);
cmd.Parameters.Add("@Security", SqlDbType.VarChar, 10).Direction = ParameterDirection.Output;
cmd.Parameters.Add("@ClientFirstName", SqlDbType.VarChar, 20).Direction = ParameterDirection.Output;
cmd.Parameters.Add("@Success", SqlDbType.Int).Direction = ParameterDirection.Output;
// set parameter values
cmd.Parameters["@ClientUsername"].Value = UserNamTextbox.Text;
// open connection and execute stored procedure
conn.Open();
cmd.ExecuteNonQuery();
// read output value from @Security
int Security = Convert.ToInt32(cmd.Parameters["@Security"].Value);
if Security == 1 ....... and so on.......
conn.Close();
}
因此,我不確定100%擁有多少C#,但這是基礎知識:
使用此SO問題中的代碼從SQL Server獲取數據: 從SQL Server數據庫填充DataTable
然后,一旦有了數據表,就可以使用for循環遍歷它(假設您將數據表定義為'dt'):
foreach (DataRow row in dt.Rows)
{
//do what you need with your data.
var value = row["ColumnName"];
Console.WriteLine(value.ToString());
}
希望能有所幫助。
您的存儲過程的結果僅返回一行,您可以檢查datatable中是否存在該列:
if (dt.columns.Contains("Security"))
{
....
}else{
// Show error in fist row, fist column
return dt.Rows[0][0].ToString();
}
您可以執行存儲的過程並將結果填充到數據集中。
每個select語句將被存儲為一個數據表,您可以使用索引訪問相應的表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.