我有此方法:
public class StoredProcedureProvider : IStoredProcedureProvider
{
private readonly string _connectionString;
public StoredProcedureProvider(IDataConfig config) => _connectionString = config.ConnectionString;
public T ExecuteScalar<T>(string procedureName, IList<SqlParameter> parameters = null)
{
return Execute(procedureName, parameters, (connection, command) =>
{
connection.Open();
var result = command.ExecuteScalar();
return (T) Convert.ChangeType(result, typeof(T));
});
}
public DataSet GetDataSet(string procedureName, IList<SqlParameter> parameters = null)
{
return Execute(procedureName, parameters, (connection, command) =>
{
var dataAdapter = new SqlDataAdapter();
var dataSet = new DataSet();
dataAdapter.SelectCommand = command;
dataAdapter.Fill(dataSet);
return dataSet;
});
}
public DataRow GetDataRow(string procedureName, IList<SqlParameter> parameters = null)
{
var dataSet = GetDataSet(procedureName, parameters);
var tables = dataSet.Tables.Cast<DataTable>().ToList();
if (!tables.Any())
throw new Exception("The DataSet contains not tables");
var dataRows = dataSet.Tables[0].Rows.Cast<DataRow>().ToList();
if (!dataRows.Any())
throw new Exception("The DataTable contains no rows");
var dataRow = dataRows.First();
return dataRow;
}
private static T Execute<T>(string procedureName, IList<SqlParameter> parameters, Func<SqlConnection, SqlCommand, T> returnMethod)
{
using (var connection = new SqlConnection(_connectionString))
{
using (var command = new SqlCommand(procedureName, connection))
{
command.CommandType = CommandType.StoredProcedure;
if (parameters == null || !parameters.Any())
return returnMethod(connection, command);
foreach (var parameter in parameters)
command.Parameters.Add(parameter);
return returnMethod(connection, command);
}
}
}
}
当我使用非字符串的参数调用任何内容时,会出现错误:
过程或函数'generalLogonFromSessionID'期望参数'@sessionID',未提供。
我用来测试的代码是:
var dataRow = _storedProcedureProvider.GetDataRow("generalLogonFromSessionID", new List<SqlParameter>
{
new SqlParameter("@sessionID", SqlDbType.UniqueIdentifier, oTokenData.TokenId.Length, oTokenData.TokenId),
new SqlParameter("@ipAddress", ipAddress)
});
但是如果我使用仅接受字符串参数的存储过程,它将很好地工作。
例如:
var dataRow = _storedProcedureProvider.GetDataRow("generalLogon", new List<SqlParameter>
{
new SqlParameter("@loginName", oTokenData.Update.User.EmailAddress),
new SqlParameter("@password", bookingType == BookingType.Commercial ? lastName : "password"),
new SqlParameter("@ipAddress", ipAddress)
});
有人知道为什么吗?
当前示例使用了错误的构造函数重载。
public SqlParameter(string parameterName, SqlDbType dbType, int size, string sourceColumn);
更新为使用以下内容
new SqlParameter("@sessionID", SqlDbType.UniqueIdentifier) {
Value = oTokenData.TokenId
};
您提供了@session参数,但我看不到您为其设置任何值。
new SqlParameter("@sessionID", SqlDbType.UniqueIdentifier) { Value = oTokenData.TokenId }