PDA

View Full Version : سوال: نوع پارامتر بازگشتی از پروسیجر sql به c#.net



mahyarfaq
سه شنبه 18 مهر 1396, 18:04 عصر
سلام بر دوستان عزیز؛
من با پروسیجر sql هم بوسیله output و هم بوسیله return مقدار به سی شارپ بر میگردونم ولی با اینکه همه تعاریف از نوع nvarchar و string هستش، ولی بازم موقع برگردوندن پیغام میده که نمیتونه از nvarchar به int تبدیل کنه. چون تو مقدار بازگشتی از متن استفاده کردم.
سوالم اینکه که آیا فقط از پروسیجرهای sql میشه مقدار int برگردونیم؟ آیا نمیشه مقدار string برگردونیم و تو برنامه استفاده کنیم؟
با سپاس

danialafshari
سه شنبه 18 مهر 1396, 20:34 عصر
با سلام
بله میشه مقدار string برگردوند و با همین output هم میشه
در صورت تمایل نمونه برنامه قرار بدید تا بررسی بشه
موفق باشید

mahyarfaq
چهارشنبه 19 مهر 1396, 14:15 عصر
این کد خدمت شما

mahyarfaq
چهارشنبه 19 مهر 1396, 14:16 عصر
حتی تمام موارد رو به string و nvarchar تبدیل کردم بازم همینه

mahyarfaq
چهارشنبه 19 مهر 1396, 14:17 عصر
با سلام
بله میشه مقدار string برگردوند و با همین output هم میشه
در صورت تمایل نمونه برنامه قرار بدید تا بررسی بشه
موفق باشید


کد sql

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


alter PROCEDURE sp_CheckUsernamePassword
@username nvarchar(100),
@password nvarchar(max) ='',
@UserID int output
AS
BEGIN
SET NOCOUNT ON;


SELECT top 1 @password = [Password], @UserID =[User_ID] FROM [OstSMS].[dbo].[Users] where UserName =@username
return convert(nvarchar(max),@password)
END
GO

کد سی شارپ
string GetPassword;
int GetUserID;
string Check_Result;
string Password = "123";
int UserID = 0;


SqlCommand Cmd = new SqlCommand("sp_CheckUsernamePassword", con);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.CommandText = "sp_CheckUsernamePassword";
Cmd.Parameters.AddWithValue("@username", "Admin");
// SqlParameter sqlParam_password = new SqlParameter("@password", DbType.String);
SqlParameter sqlParam_UserID = new SqlParameter("@UserID", DbType.Int32);


//sqlParam_password.Direction = ParameterDirection.Output;
sqlParam_UserID.Direction = ParameterDirection.Output;


//Cmd.Parameters.Add(sqlParam_password);
Cmd.Parameters.Add(sqlParam_UserID);


con.Open();
Cmd.ExecuteNonQuery();
Cmd.ExecuteScalar();
GetPassword = (string)Cmd.ExecuteScalar();
con.Close();
// GetPassword = (string)Cmd.Parameters["@password"].Value;


MessageBox.Show(GetPassword);
GetUserID = (int)Cmd.Parameters["@UserID"].Value;

using (MD5 md5Hash = MD5.Create())
{
string hash = GetMd5Hash(md5Hash, Password);
if (VerifyMd5Hash(md5Hash, Password, GetPassword))
{
Check_Result = "true";
UserID = GetUserID;
}
else
{
Check_Result = "false";
}
}



پیغام خطا:
An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll


Additional information: Conversion failed when converting the nvarchar value '202cb962ac59075b964b07152d234b70' to data type int.

محمد آشتیانی
چهارشنبه 19 مهر 1396, 18:34 عصر
سلام
به اینصورت اصلاح بفرمائید

Stored Procedure

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE sp_CheckUsernamePassword
@username nvarchar(100),
@password nvarchar(max) output,
@UserID int output
AS
BEGIN
SET NOCOUNT ON;
SELECT top 1 @password = [Password], @UserID =[User_ID] FROM [OstSMS].[dbo].[Users] where UserName = @username
END
GO



کدتون هم به اینصورت

string Check_Result;
string Password = "123";
int UserID = 0;


var cmd = new SqlCommand("sp_CheckUsernamePassword", con)
{
CommandType = CommandType.StoredProcedure,
CommandText = "sp_CheckUsernamePassword"
};


cmd.Parameters.AddWithValue("@Username", "Admin");
cmd.Parameters.Add("@Password", SqlDbType.NVarChar, -1).Direction = ParameterDirection.Output;
cmd.Parameters.Add("@UserId", SqlDbType.NVarChar, -1).Direction = ParameterDirection.Output;


con.Open();
cmd.ExecuteNonQuery();
var getPassword = cmd.Parameters["@Password"].Value.ToString();
var getUserId = Convert.ToInt32(cmd.Parameters["@UserId"].Value);
con.Close();


MessageBox.Show(getPassword);

using (MD5 md5Hash = MD5.Create())
{
string hash = GetMd5Hash(md5Hash, Password);
if (VerifyMd5Hash(md5Hash, Password, getPassword))
{
Check_Result = "true";
UserID = getUserId;
}
else
{
Check_Result = "false";
}
}




موفق باشید.