我有一种方法可以为数据库添加值以进行所有操作。
如果从数据库中选择了此选项,则此选择将从数据库中返回更多行, 如何获取行并存储在数组中?
这是方法代码:
public void ExcuteProcedure(string procName, List<SqlParameter> procparams)
{
try
{
SqlConnection mycon = new SqlConnection(connectionString);
mycon.Open();
SqlCommand mycom = new SqlCommand();
mycom.Connection = mycon;
mycom.CommandText = procName;
mycom.CommandType = CommandType.StoredProcedure;
foreach (var item in procparams)
{
SqlParameter myparm = new SqlParameter();
myparm.ParameterName = item.ParameterName;
// myparm.SqlDbType = item.SqlDbType;
myparm.Value = item.Value;
mycom.Parameters.Add(myparm);
}
var n= mycom.ExecuteScalar();
mycon.Close();
}
catch (SqlException e)
{
Console.WriteLine("Error Number is : " + e.Number);
Console.WriteLine("Error Message is : " + e.Message);
}
}
答案 0 :(得分:7)
您需要拨打mycom.ExecuteReader()
,这会给您一个SqlDataReader
,可以读取结果。
致电Read()
以推进行。
答案 1 :(得分:3)
我看到开发人员试图抽象出简单的数据库连接的次数,这让我很惊讶;以及他们不可避免地搞砸的无数方式。
以下可能听起来很有意思,但需要说: 清理你的代码,它像筛子一样泄漏。在连接和命令对象周围使用子句几乎是强制性的。如果您忘记单个参数或输入错误值,您将会泄漏连接。一旦连接池被填满,您的应用程序将以各种有趣且通常难以调试的方式崩溃。
接下来,如果您不确定如何从数据库中正确地获取记录,那么您可能不应该尝试抽象调用您的过程的代码。要么使用像Dapper之类的轻量级ORM,要么了解你正在做的事情最终会涉及到项目中的下一个开发人员想要破解的大量无关代码。
/ rant over。
回到问题:ExecuteScalar
返回单个值。您需要使用ExecuteReader
。我建议您只需读取读者的结果,将其填入datatable
并将其传递回调用代码。
答案 2 :(得分:0)
var n = mycom.ExecuteScalar();
标量:一次只能容纳一个值的原子数
DataReader
,iterate through its rows DataSet
填充DataAdapter
(如果结果集中有多个表,则更合适。)