代码之家  ›  专栏  ›  技术社区  ›  Vaethin

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

  •  0
  • Vaethin  · 技术社区  · 6 年前

    我正在尝试编写一个方法,该方法只接受一个字符串,该字符串是 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));

    然而,这完全破坏了我试图做的事情——写一个通用版本。我所需要的只是一种构造,它包含我从sqlserver获得的信息,如果我在ssms中键入相同的命令,我就不在乎为了读取C中的数据,我必须通过哪些循环来为每一行使用一个对象数组,必须手动将每个对象转换成一个字符串、in t或任何完全可以接受的类型,ev像csv这样的字符串就可以了

    我唯一不想做的就是为表或固定数量的行添加定义。使用的每个方法 ExecuteCommand() 必须知道返回的对象数组是什么类型,这很好,但是除了SQL命令之外,添加一些包含类型和列名的复杂数据结构似乎有点过头了。

    有没有更简单的方法来实现这一点?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gerald Chifanzwa    6 年前

    你有的是 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);
    
        2
  •  0
  •   Slapout    6 年前

    我使用类似这样的代码输入了一个通用的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);
    }