Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从存储过程中获取多行?_C#_Sql_Stored Procedures_Ado.net - Fatal编程技术网

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阿门,兄弟!我经常感到惊讶的是,即使是那些最基本的原则显然也没有被教授(或者只是没有被学生吸收?)