C# SQL 服务器存储过程未返回预期值
C# SQL Server stored procedure not returning expected value
我把这个函数写到 return 一个数据集,我期待一个更小的数据集,因为我只期待一个值,但我得到一个相当臃肿的对象,我找不到我想要的值正在寻找,这会导致问题,因为我打算大量使用此功能。
我希望有人能发现我做错了什么,我已经包含了代码、returned 对象的屏幕截图以及我的期望。任何帮助将不胜感激。
如果我在这个问题中没有正确表达任何内容,请随时告诉我,我很难很好地表达我的想法。
public DataSet getPartnerParameter(string parameter)
{
using (var dbConnection = new SqlConnection(UnityHelper.IocContainer.Resolve<IConfigHelperService>().GetConnectionString("CASConnectionString")))
{
dbConnection.Open();
using (var dbCommand = new SqlCommand("GETPARTNERPARAMETER"))
{
dbCommand.CommandType = CommandType.StoredProcedure;
dbCommand.Connection = dbConnection;
SqlParameter lstrParameter = new SqlParameter("@Parameter", SqlDbType.VarChar);
lstrParameter.Value = parameter;
dbCommand.Parameters.Add(lstrParameter);
var ldaDPS = new SqlDataAdapter(dbCommand);
var ldstParameterValues = new DataSet();
ldaDPS.Fill(ldstParameterValues);
return ldstParameterValues;
}
}
}
这就是我期待找到的东西
编辑//
稍微更改了我的代码,但仍然无法正常工作。
public String[] getPartnerParameter(string parameter)
{
using (var dbConnection = new SqlConnection(UnityHelper.IocContainer.Resolve<IConfigHelperService>().GetConnectionString("CASConnectionString")))
{
dbConnection.Open();
SqlCommand dbCommand = new SqlCommand("GETPARTNERPARAMETER", dbConnection);
dbCommand.CommandType = CommandType.StoredProcedure;
SqlParameter lstrParameter = new SqlParameter("@Parameter", SqlDbType.VarChar);
lstrParameter.Value = parameter;
dbCommand.Parameters.Add(lstrParameter);
SqlDataReader reader = dbCommand.ExecuteReader();
string[] results = new string[2];
while (reader.Read())
{
results[0] = reader[0].ToString();
results[1] = reader[1].ToString();
}
if (results.Length < 1)
{
results[0] = "Cannot find Value";
results[1] = "S";
return results;
}
else
{
return results;
}
}
错误是这样的:
{“过程或函数 'GETPARTNERPARAMETER' 需要参数‘@Parameter’,但未提供。”}
您要查找的值可能在 dataSet.Tables[0].Rows[0] 行中。
但是,如果您希望返回一排,那么 DataSet 对象似乎有些矫枉过正。我建议避免使用 SqlDataAdapter/DataSet 而是使用 SqlDataReader。
未经测试的代码,但应该会告诉您如何使用它的要点:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand dbCommand = new SqlCommand("GETPARTNERPARAMETER", connection);
dbCommand.CommandType = CommandType.StoredProcedure;
SqlParameter lstrParameter = new SqlParameter("@Parameter", SqlDbType.VarChar);
lstrParameter.Value = "LexisNexisCreditConsentRequired";
dbCommand.Parameters.Add(lstrParameter);
SqlDataReader reader = dbCommand.ExecuteReader();
while (reader.Read())
{
var yourValue = reader[0];
var yourDataType = reader[1];
}
}
一个DataSet
是一个可以包含很多表的对象。它不是必须的,但它可以,因此它还有许多字段、属性和方法来支持该角色。
对于此查询,请查看 ldstParameterValues.Tables[0].Rows[0]
。在该行中,您还可以看到具有另一级别括号索引的列:
DataRow row = ldstParameterValues.Tables[0].Rows[0];
var column0Value row[0];
var column1Value = row[1];
但是,这些结果的类型是 object。您需要强制转换值或在数据行上使用 GetX()
方法之一以获得具有有意义类型的结果。
我把这个函数写到 return 一个数据集,我期待一个更小的数据集,因为我只期待一个值,但我得到一个相当臃肿的对象,我找不到我想要的值正在寻找,这会导致问题,因为我打算大量使用此功能。
我希望有人能发现我做错了什么,我已经包含了代码、returned 对象的屏幕截图以及我的期望。任何帮助将不胜感激。
如果我在这个问题中没有正确表达任何内容,请随时告诉我,我很难很好地表达我的想法。
public DataSet getPartnerParameter(string parameter)
{
using (var dbConnection = new SqlConnection(UnityHelper.IocContainer.Resolve<IConfigHelperService>().GetConnectionString("CASConnectionString")))
{
dbConnection.Open();
using (var dbCommand = new SqlCommand("GETPARTNERPARAMETER"))
{
dbCommand.CommandType = CommandType.StoredProcedure;
dbCommand.Connection = dbConnection;
SqlParameter lstrParameter = new SqlParameter("@Parameter", SqlDbType.VarChar);
lstrParameter.Value = parameter;
dbCommand.Parameters.Add(lstrParameter);
var ldaDPS = new SqlDataAdapter(dbCommand);
var ldstParameterValues = new DataSet();
ldaDPS.Fill(ldstParameterValues);
return ldstParameterValues;
}
}
}
这就是我期待找到的东西
编辑//
稍微更改了我的代码,但仍然无法正常工作。
public String[] getPartnerParameter(string parameter)
{
using (var dbConnection = new SqlConnection(UnityHelper.IocContainer.Resolve<IConfigHelperService>().GetConnectionString("CASConnectionString")))
{
dbConnection.Open();
SqlCommand dbCommand = new SqlCommand("GETPARTNERPARAMETER", dbConnection);
dbCommand.CommandType = CommandType.StoredProcedure;
SqlParameter lstrParameter = new SqlParameter("@Parameter", SqlDbType.VarChar);
lstrParameter.Value = parameter;
dbCommand.Parameters.Add(lstrParameter);
SqlDataReader reader = dbCommand.ExecuteReader();
string[] results = new string[2];
while (reader.Read())
{
results[0] = reader[0].ToString();
results[1] = reader[1].ToString();
}
if (results.Length < 1)
{
results[0] = "Cannot find Value";
results[1] = "S";
return results;
}
else
{
return results;
}
}
错误是这样的: {“过程或函数 'GETPARTNERPARAMETER' 需要参数‘@Parameter’,但未提供。”}
您要查找的值可能在 dataSet.Tables[0].Rows[0] 行中。
但是,如果您希望返回一排,那么 DataSet 对象似乎有些矫枉过正。我建议避免使用 SqlDataAdapter/DataSet 而是使用 SqlDataReader。
未经测试的代码,但应该会告诉您如何使用它的要点:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand dbCommand = new SqlCommand("GETPARTNERPARAMETER", connection);
dbCommand.CommandType = CommandType.StoredProcedure;
SqlParameter lstrParameter = new SqlParameter("@Parameter", SqlDbType.VarChar);
lstrParameter.Value = "LexisNexisCreditConsentRequired";
dbCommand.Parameters.Add(lstrParameter);
SqlDataReader reader = dbCommand.ExecuteReader();
while (reader.Read())
{
var yourValue = reader[0];
var yourDataType = reader[1];
}
}
一个DataSet
是一个可以包含很多表的对象。它不是必须的,但它可以,因此它还有许多字段、属性和方法来支持该角色。
对于此查询,请查看 ldstParameterValues.Tables[0].Rows[0]
。在该行中,您还可以看到具有另一级别括号索引的列:
DataRow row = ldstParameterValues.Tables[0].Rows[0];
var column0Value row[0];
var column1Value = row[1];
但是,这些结果的类型是 object。您需要强制转换值或在数据行上使用 GetX()
方法之一以获得具有有意义类型的结果。