c# - 从 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);
我可以使用什么来代替字典,以便我可以返回一个集合。
解决方案
在您的代码中肯定不起作用的是您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
}
);
推荐阅读
- sql - 如何使用递归找到社交网络中的联系程度
- node.js - 如何在 Node 中使用“fs”在本地保存 FormData 图像文件
- oracle - Oracle 搜索不区分大小写的 CLOB
- c# - 对于 Azure B2C,是否可以通过声明发送用户主体名称?
- php - 在不同范围内的页面上的位置输出 PHP 变量值?
- c - 当输入为“1200”和“1300”时,如何使输出为“1”?
- php - Angular - PHP -> 发送邮件 null php 值
- c# - 没有 IIS 的 .Net / c# 上的 WebSockets(自托管)
- bash - 如何将换行符字符串保留为 bash 中的字符串?
- vbulletin - vbulletin 4.2.5 并在发送访问者消息后出现错误:未填写名为 contentid 的必填字段或