我正在尝试编写一个方法,SQL它只接受一个字符串,它是一个命令,并针对预定义的数据库/服务器运行它......这是我到目前为止所拥有的:
public class TSqlConnector : IDbConnector
{
private readonly string _connectionString;
public TSqlConnector(string conn)
{
_connectionString = conn;
}
public IEnumerable<object[]> ExecuteCommand(string query)
{
var res = new List<object[]>();
try
{
using (SqlConnection sql = new SqlConnection(_connectionString))
{
sql.Open();
SqlCommand cmd = new SqlCommand(query, sql);
var reader = cmd.ExecuteReader();
DataTable tbl = new DataTable();
while (reader.Read())
{
var dr = tbl.NewRow();
dr.ItemArray = new object[reader.FieldCount];
reader.GetValues(dr.ItemArray);
res.Add(dr.ItemArray);
}
}
return res;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
}
}
然而,这段代码给了我一个错误说
输入数组比此表中的列数长。
我用谷歌搜索了错误消息,显然我首先必须定义数据表的列,使用 tbl.Add("ColumnName", typeof(type));
然而,这完全破坏了我试图做的事情——编写一个通用版本。我想要的只是某种结构,其中包含如果我在 SSMS 中键入相同的命令,我将从 SqlServer 获得的信息,我并不真正关心我必须跳过哪些环节才能读取 C# 中的数据;对每一行使用对象数组,必须手动将每个对象转换为字符串、int 或任何完全可以接受的内容,即使是类似 CSV 的字符串也可以
我唯一不想做的就是为表或固定数量的行添加定义。使用的每个方法ExecuteCommand()都必须知道返回什么类型的对象数组,这很好,但是除了 SQL 命令之外,添加一些包含类型和列名的复杂数据结构似乎有点过头了。
有没有更简单的方法来实现这一目标?
人到中年有点甜
开满天机
相关分类