C# 如何从存储过程中获取多行?
我有一种方法可以为所有操作向数据库添加值 如果从数据库中选择此选项,并且此选项从数据库中返回更多行, 如何获取行并存储在数组中 这是方法代码:C# 如何从存储过程中获取多行?,c#,sql,stored-procedures,ado.net,C#,Sql,Stored Procedures,Ado.net,我有一种方法可以为所有操作向数据库添加值 如果从数据库中选择此选项,并且此选项从数据库中返回更多行, 如何获取行并存储在数组中 这是方法代码: public void ExcuteProcedure(string procName, List<SqlParameter> procparams) { try { SqlConnection mycon = new SqlConnection(connecti
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);
}
}
public void ExcuteProcedure(字符串procName,列表procparams)
{
尝试
{
SqlConnection mycon=新的SqlConnection(connectionString);
mycon.Open();
SqlCommand mycom=新的SqlCommand();
mycom.Connection=mycon;
mycom.CommandText=procName;
mycom.CommandType=CommandType.storedProcess;
foreach(procparams中的变量项)
{
SqlParameter myparm=新的SqlParameter();
myparm.ParameterName=item.ParameterName;
//myparm.SqlDbType=item.SqlDbType;
myparm.Value=item.Value;
mycom.Parameters.Add(myparm);
}
var n=mycom.ExecuteScalar();
mycon.Close();
}
捕获(SQLE异常)
{
Console.WriteLine(“错误号为:”+e.Number);
Console.WriteLine(“错误消息为:”+e.Message);
}
}
您需要调用mycom.ExecuteReader()
,这将为您提供一个SqlDataReader
,它可以读取结果
调用Read()
var n = mycom.ExecuteScalar();
标量:一次只能容纳一个值的原子量
- 返回一个
DataReader
,然后
- 使用
DataAdapter
填充DataSet
(如果结果集中有多个表,这更合适)
我看到开发人员试图抽象出简单的数据库连接的次数从未停止过,这让我感到惊讶;他们用无数种方式不可避免地把事情搞砸了
下面这句话听起来可能意味着什么,但需要指出:
清理你的代码,它像筛子一样泄漏。在连接和命令对象周围使用子句几乎是强制性的。目前,如果您忘记了一个参数或输入了一个错误的值,您将泄漏连接。一旦连接池被填满,你的应用程序就会以各种有趣的方式崩溃,而且通常很难调试
接下来,如果您不确定如何正确地从数据库中获取记录,那么您可能不应该尝试抽象调用过程的代码。要么使用轻量级的ORM,要么了解您所做的工作最终将如何涉及到大量的无关代码,这些代码是您项目的下一位开发人员想要删除的
/大声喊叫
回到问题:
ExecuteScalar
返回单个值。您需要使用ExecuteReader
。我建议您只需将读取器的结果填入数据表
,并将其传递回调用代码。为什么要复制所有参数?另外,不要接受例外情况。另外,使用和语句关闭读卡器、命令和连接。+1阿门,兄弟!我经常感到惊讶的是,即使是那些最基本的原则显然也没有被教授(或者只是没有被学生吸收?)