Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中执行通用SQL命令?_C#_Sql Server - Fatal编程技术网

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

C# 如何在C中执行通用SQL命令?,c#,sql-server,C#,Sql Server,我正在尝试编写一个方法,它只接受一个字符串,这是一个SQL命令,并在预定义的数据库/服务器上运行它。。。这就是我到目前为止所做的: public class TSqlConnector : IDbConnector { private readonly string _connectionString; public TSqlConnector(string conn) { _connectionString = conn; } publ

我正在尝试编写一个方法,它只接受一个字符串,这是一个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.AddColumnName、typeoftype定义DataTable的列

然而,这完全破坏了我试图做的事情——编写一个通用版本。我想要的只是某种结构,它包含了如果我在SSMS中键入相同的命令,我将从SqlServer获得的信息,我并不真正关心在C中读取数据时需要跳转什么环;为每行使用对象数组,必须手动将每个对象转换为字符串、int或任何完全可以接受的内容,即使是类似CSV的字符串也可以

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

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

您拥有的是来自cmd.ExecuteReader的IDataReader

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

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);
您拥有的是来自cmd.ExecuteReader的IDataReader

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

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);

我使用了这样的代码来输入一个通用SQL查询,并将结果作为datatable返回。当然,您必须解析出您需要的结果

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);
}

我使用了这样的代码来输入一个通用SQL查询,并将结果作为datatable返回。当然,您必须解析出您需要的结果

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);
}

研究如何使用数据适配器而不是数据读取器。例如,您可以使用实体框架。顺便说一句,当类型是数据库不支持的东西时,您希望得到什么输出?例如,枚举。tbl.AddColumnName,颜色类型;或者甚至丢掉桌子或者更糟。。。提供这样的服务可能非常危险,这取决于您如何/在何处公开此功能…我希望您不是从用户那里接受此查询。如果您问我,我不会这样做。还有更好的选择,比如使用数据适配器而不是数据读取器。顺便说一句,当类型是数据库不支持的东西时,您希望得到什么输出?例如,枚举。tbl.AddColumnName,颜色类型;或者甚至丢掉桌子或者更糟。。。提供这样的服务可能非常危险,这取决于您如何/在何处公开此功能…我希望您不是从用户那里接受此查询。如果您问我,我不会这样做。有很多更好的选择,比如甜食!我觉得必须有一个更简单的方法,但我可能一辈子都想不出来!非常感谢。含糖的我觉得必须有一个更简单的方法,但我可能一辈子都想不出来!非常感谢。