【发布时间】:2019-07-23 06:41:14
【问题描述】:
我是 asp.net 开发人员。我正在执行存储过程并使用 ExecuteScaler 方法获取列计数读数。但没有成功,它会给出这样的类型转换错误:
我有这个代码:
protected int isValidUser()
{
try
{
return Convert.ToInt32(Mysql.ExecuteScalar("Support_UserLogin", AppGlobal.UserName, AppGlobal.Password));
}
catch (Exception ex)
{
AppGlobal.QLog.Enqueue(new clsLogType() { Message = System.Reflection.MethodBase.GetCurrentMethod().Name, ex = ex, logType = LogType.Error });
return 0 ;
}
}
这是我存储的过程代码:
USE [NEWBULKSMS]
GO
/****** Object: StoredProcedure [dbo].[Support_UserLogin] Script Date: 01/03/2019 2:12:10 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Support_UserLogin]
@Username varchar(100),
@Password varchar(100)
AS
BEGIN
BEGIN TRY
SET NOCOUNT ON;
-- Insert statements for procedure here
select count(*) from users where strUserName = @Username and strPassword = @password;
END TRY
BEGIN CATCH
EXEC [dbo].[usp_LogErrorHistory];
DECLARE @err VARCHAR(MAX)
SELECT @err = ERROR_MESSAGE()
RAISERROR('Error while getting : [dbo].[Support_UserLogin]', 16, 1, @err)
END CATCH
END
完成后我收到了类似Failed to convert string to Int32的错误
这是怎么回事……
---------------------已更新---------- ---------------------------
当在 SSMS 中运行这个存储过程时,这会在没有列名的情况下返回 1。
USE [NEWBULKSMS]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[Support_UserLogin]
@Username = N'shalingajjar',
@Password = N'shalsoft$3433'
SELECT 'Return Value' = @return_value
GO
------------------------------------已更新-------- -----------------------------
这里我包含 ExecuteScaler 代码更多信息
#region ExecuteScalar
public static object ExecuteScalar(CommandType commandType, string commandText, params SqlParameter[] commandParameters)
{
using (SqlConnection cn = new SqlConnection(ConString))
{
cn.Open();
return ExecuteScalar(cn, commandType, commandText, commandParameters);
}
}
public static object ExecuteScalar(string spName, params object[] parameterValues)
{
if ((parameterValues != null) && (parameterValues.Length > 0))
{
SqlParameter[] commandParameters = GetSpParameterSet(spName);
AssignParameterValues(commandParameters, parameterValues);
return ExecuteScalar(CommandType.StoredProcedure, spName, commandParameters);
}
else
{
return ExecuteScalar(CommandType.StoredProcedure, spName);
}
}
public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
{
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);
object retval = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return retval;
}
private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters)
{
if(connection.State != ConnectionState.Open)
{
connection.Open();
}
command.Connection = connection;
command.CommandText = commandText;
if (transaction != null)
{
command.Transaction = transaction;
}
command.CommandType = commandType;
if (commandParameters != null)
{
AttachParameters(command, commandParameters);
}
return;
}
private static void AttachParameters(SqlCommand command, SqlParameter[] commandParameters)
{
foreach (SqlParameter p in commandParameters)
{
if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
{
p.Value = DBNull.Value;
}
command.Parameters.Add(p);
}
}
private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues)
{
if ((commandParameters == null) || (parameterValues == null))
{
return;
}
if (commandParameters.Length < parameterValues.Length)
{
throw new ArgumentException("Parameter count does not match Parameter Value count.");
}
for (int i = 0, j = commandParameters.Length; i < j; i++)
{
if (i < parameterValues.Length)
{
if (commandParameters[i].DbType.ToString() == "String")
commandParameters[i].Value = (parameterValues[i] == null ? "" : parameterValues[i]);
else
commandParameters[i].Value = parameterValues[i];
}
else
{
break;
}
}
}
#endregion
【问题讨论】:
-
从 SSMS 执行过程时会发生什么?
-
@HoneyBadger 请查看我更新的部分。
-
var result = Convert.ToInt32(Mysql.ExecuteScalar("Support_UserLogin", AppGlobal.UserName, AppGlobal.Password));并检查result -
@FortyTwo 由于 Convert.ToInt32 发生异常,没有结果显示任何值..
-
执行
var x = Mysql.ExecuteScalar(...);,然后检查x的内容。另外,那个函数是什么,给我们看看它的代码。
标签: c# sql asp.net sql-server tsql