为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 C# 中执行通用 SQL 命令?

如何在 C# 中执行通用 SQL 命令?

C#
慕后森 2021-10-24 19:35:02
我正在尝试编写一个方法,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 命令之外,添加一些包含类型和列名的复杂数据结构似乎有点过头了。有没有更简单的方法来实现这一目标?
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

你拥有的是IDataReader来自你的cmd.ExecuteReader();


要将结果加载到 中DataTable,您可以使用以下Load方法:


var reader = cmd.ExecuteReader();

DataTable tbl = new DataTable();

tbl.Load(reader);

// now tbl contains the corresponding columns and rows from your sql command.


// Then you can return the ItemArrays from each row;


return tbl.Rows.Cast<DataRow>().Select(row => row.ItemArray);


查看完整回答
反对 回复 2021-10-24
?
开满天机

TA贡献1786条经验 获得超13个赞

我已经使用这样的代码来输入通用 SQL 查询并将结果作为数据表返回。当然,您必须根据需要解析结果。


private DataTable QueryToTable(string sql, string cs)

{


    var ds = new DataSet();


    using (var adapter = new SqlDataAdapter(sql, cs))

    {

        adapter.Fill(ds);

    }


    return ds.Tables(0);

}


查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 218 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信