首页 > 解决方案 > 从 DB 通用函数读取数据

问题描述

我是在 dot net 工作的新手。我要做的是创建一个辅助方法,该方法将从数据库中获取任何表的数据。我已经动态地传递了参数,它工作正常。但是当我尝试读取数据时,我发现很难将数据存储在某个集合中。这我将返回到我的调用点并将其绑定到响应类型并返回。

public static Dictionary<Dictionary<string, object>, object> GetData(SqlCommand cmd, string connectionString, List<SqlParameter> parameters)
        {
            try
            {
                SqlDataReader reader = null;
                Dictionary<Dictionary<string,object>, object> returnObjects = new Dictionary<Dictionary<string, object>, object>();
                Dictionary<string, object> returnObject = new Dictionary<string, object>();

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))
                {
                    sqlConnection.Open();
                    cmd.Connection = sqlConnection;
                    cmd.CommandType = CommandType.StoredProcedure;

                    foreach (SqlParameter parameter in parameters)
                    {
                        cmd.Parameters.Add(parameter);
                    }

                    reader = cmd.ExecuteReader();

                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                returnObject.Add(reader.GetName(i), reader[i]);
                            }
                            returnObject.Clear();
                            returnObjects.Add(returnObject, reader);
                        }
                    }
                }
                return returnObjects;
            }
            catch (Exception ex)
            {

                throw;
            }
        }

在上面的代码中,当我尝试添加returnObjects字典时,它说键已经添加。下面是我打电话和patientResponse我想返回的代码。

Dictionary<Dictionary<string, object>, object> dct = new Dictionary<Dictionary<string, object>, object>();
                dct = Helper.GetData(cmd, connectionString, parameters);

List<Patient_Response> pp = new List<Patient_Response>();
 Patient_Response pr = new Patient_Response();
 pr.Patient_Id = int.Parse(reader["ID"].ToString());
 pr.FIRST_NAME = reader["FIRST_NAME"].ToString();
 pr.LAST_NAME = reader["LAST_NAME"].ToString();
 pr.phoneNumber = reader["TEL"].ToString();
 pr.email = reader["EMAIL"].ToString();
 pr.Address = reader["Address"].ToString();
 pr.Gender = reader["Gender"].ToString();
 pr.DOB = Convert.ToDateTime(reader["DOB"]).ToString("MM/dd/yyyy");
 pp.Add(pr);

我可以使用什么来代替字典,以便我可以返回一个集合。

标签: c#sqlsql-server

解决方案


在您的代码中肯定不起作用的是您returnObject为每一行添加相同的实例。你应该new Dictionary<string, object>()while. 此外,如果您的结果集包含重复的字段名称,您将收到异常。

public static List<Dictionary<string, object>> GetData(SqlCommand cmd, string connectionString, List<SqlParameter> parameters)
        {
            try
            {
                SqlDataReader reader = null;
                // changed this to be a list
                List<Dictionary<string,object>> returnObjects = new List<Dictionary<string, object>>();

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))
                {
                    sqlConnection.Open();
                    cmd.Connection = sqlConnection;
                    cmd.CommandType = CommandType.StoredProcedure;

                    foreach (SqlParameter parameter in parameters)
                    {
                        cmd.Parameters.Add(parameter);
                    }

                    reader = cmd.ExecuteReader();

                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            // create a new returnObject for each row
                            Dictionary<string, object> returnObject = new Dictionary<string, object>();

                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                // following line throws an exception if there are multiple fields with the same name
                                returnObject.Add(reader.GetName(i), reader[i]);
                            }
                            returnObjects.Add(returnObject);
                        }
                    }
                }
                return returnObjects;
            }
            catch (Exception ex)
            {

                throw;
            }
        }

也就是说,首先将 的内容reader放入字典列表然后放入Patient_Response. 你还不如直接从读者那里填写一个List<Patient_Response>(即在里面while)。

执行此操作的通用方法可能是(代码未经验证可编译或运行):

public static List<T> GetData<T>(
   SqlCommand cmd, 
   string connectionString, 
   List<SqlParameter> parameters, 
   Func<IDataReader, T> readerToRow) 
{
   List<T> returnObjects = new List<T>();

   using (SqlConnection sqlConnection = new SqlConnection(connectionString))
   {
      sqlConnection.Open();
      cmd.Connection = sqlConnection;
      cmd.CommandType = CommandType.StoredProcedure;

      foreach (SqlParameter parameter in parameters)
      {
         cmd.Parameters.Add(parameter);
      }

      SqlDataReader reader = cmd.ExecuteReader();

      while (reader.Read())
      {
         returnObjects.Add(readerToRow(reader));
      }
   }
   return returnObjects;
}

// To call above function:
List<Patient_Response> pp = Helper.GetData(
   cmd, 
   connectionString, 
   parameters, 
   reader => 
      new Patient_Response
      { 
         FIRST_NAME = reader["FIRST_NAME"].ToString(),
         LAST_NAME = reader["LAST_NAME"].ToString(),
         // more columns go here
      }
);


推荐阅读