【问题标题】:SQLCommand not returning anything in WritelineSQLCommand 在 Writeline 中没有返回任何内容
【发布时间】:2014-03-21 09:59:36
【问题描述】:

我目前正在尝试建立一个到我们数据库的 sqlconnection,它将返回所有列/行的数据类型(需要这样做,以便我们可以将数据输入 API)。这些数据被放置在一个数据表中,然后通过一个哈希表来获取类型。

问题在于,当程序运行时,没有发生错误,但在控制台写入行中没有返回任何已指定的内容。我不是一个经验丰富的 .net 开发人员,所以我不确定我错过了什么,但我的猜测是按照打开 sql 命令/连接的顺序?

static void Main(string[] args)
{
    Hashtable sqlDatatypeholder = new Hashtable();

   //Sql Connection      
    string _mySqlUrl = "connection is correct and works in other test apps";    
    string _mySqlQuery = "Query is here, it works fine in SQL management studio";

    SqlConnection conn = new SqlConnection(_mySqlUrl);
    SqlCommand comm = new SqlCommand(_mySqlQuery, conn);

    DataTable _tempTable = new DataTable();

    using (conn)
    {
        SqlCommand command = new SqlCommand(_mySqlQuery,conn);
        conn.Open();

        SqlDataReader reader = command.ExecuteReader();    
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                for (int v = 0; v < _tempTable.Columns.Count; v++)
                {
                    DataColumn dc = _tempTable.Columns[v];
                    sqlDatatypeholder.Add(dc.ColumnName.ToString(), Convert.ToString(reader.GetSqlValue(v).GetType()));
                }

                foreach (DictionaryEntry hr in sqlDatatypeholder)
                {
                    Console.WriteLine(hr.Key + " " + hr.Value);
                }
            }
        }
        else
        {
             Console.WriteLine("Connection Open - No rows found.");
        }
        reader.Close();
    }

    //Console.WriteLine("Created Sheet " + SmartSheetid);
     Console.ReadLine();

}

【问题讨论】:

  • 请更有效地格式化您的代码。由于缩进不一致(而且很多缩进需要水平滚动),目前真的很难阅读。
  • 您正在定义 _tempTable 然后直接执行 _tempTable.Columns.Count; 这将始终为零...所以您的 for 循环将永远不会执行

标签: c# .net datatable hashtable sqlcommand


【解决方案1】:

您的_tempTable Table 是空的,您没有填满它,这就是您无法得到任何东西的原因。试试这个代码希望它会有所帮助。

DataTable _tempTable = new DataTable();
SqlDataAdapter a = new SqlDataAdapter("Your Query",conn);
a.Fill(_tempTable);

您也可以使用此代码,它也可以工作

static void Main(string[] args)
{
    Hashtable sqlDatatypeholder = new Hashtable();
    //Sql Connection      
    string _mySqlUrl = "connection is correct and works in other test apps";
    string _mySqlQuery = "Query is here, it works fine in SQL management studio";

    SqlConnection conn = new SqlConnection(_mySqlUrl);
    SqlCommand comm = new SqlCommand(_mySqlQuery, conn);

    DataTable _tempTable = new DataTable();

    using (conn)
    {
        SqlCommand command = new SqlCommand(_mySqlQuery, conn);
        conn.Open();

        SqlDataReader reader = command.ExecuteReader();
        _tempTable.Load(reader);

        if (_tempTable != null && _tempTable.Rows.Count > 0)
        {
            for (int v = 0; v < _tempTable.Columns.Count; v++)
            {
                DataColumn dc = _tempTable.Columns[v];
                sqlDatatypeholder.Add(dc.ColumnName.ToString(), Convert.ToString(reader.GetSqlValue(v).GetType()));
            }
            foreach (DictionaryEntry hr in sqlDatatypeholder)
            {
                Console.WriteLine(hr.Key + " " + hr.Value);
            }
        }
        else
        {
            Console.WriteLine("Connection Open - No rows found.");
        }   
        reader.Close();             
    }
}

【讨论】:

  • 这似乎破坏了 sqlcommand,我们需要执行 reader 来获取数据类型。此方法的重要之处不是从数据库返回数据,而是保存列的数据类型。另一个答案看起来可能是正确的,但它在代码行 sqlDatatypeholder.Add(dc.ColumnName.ToString(), Convert.ToString(reader.GetSqlValue(v).GetType()));
  • 你可以使用这个sql查询只获取数据类型(表模式)而不是获取数据'SELECT TOP 0 your_table.* FROM your_table WHERE 1 = 2;'
【解决方案2】:

我看到在您的哈希表中获取值需要进行以下更改。注意异常处理必须尝试添加:

    static void Main(string[] args)
    {
        Hashtable sqlDatatypeholder = new Hashtable();
        //Sql Connection      
        string _mySqlUrl = "connection is correct and works in other test apps";
        string _mySqlQuery = "Query is here, it works fine in SQL management studio";

        SqlConnection conn = new SqlConnection(_mySqlUrl);
        SqlCommand comm = new SqlCommand(_mySqlQuery, conn);

        DataTable _tempTable = new DataTable();

        using (conn)
        {
            SqlCommand command = new SqlCommand(_mySqlQuery, conn);
            conn.Open();

            SqlDataReader reader = command.ExecuteReader();
            _tempTable.Load(reader);
            reader.Close();

            if (_tempTable != null && _tempTable.Rows.Count > 0)
            {
                for (int v = 0; v < _tempTable.Columns.Count; v++)
                {
                    DataColumn dc = _tempTable.Columns[v];
                    sqlDatatypeholder.Add(dc.ColumnName.ToString(), dc.GetType()); //dc.DataType //Convert.ToString(reader.GetSqlValue(v).GetType()));
                }
                foreach (DictionaryEntry hr in sqlDatatypeholder)
                {
                    Console.WriteLine(hr.Key + " " + hr.Value);
                }
            }
            else
            {
                Console.WriteLine("Connection Open - No rows found.");
            }                
        }
    }

【讨论】:

  • 干杯,但是当我尝试运行此程序时,我收到异常“附加信息:关闭阅读器时调用 CheckDataIsReady 的尝试无效。” , 任何想法?这里这一行,sqlDatatypeholder.Add(dc.ColumnName.ToString(), Convert.ToString(reader.GetSqlValue(v).GetType()));
  • 我做了必要的修改。阅读器已关闭时不得用于获取类型。
  • 真棒喝彩。两个答案都是正确的,所以我不得不选择一个票数最高的作为答案,对不起。
【解决方案3】:

在帖子的帮助下,我和另一位开发人员提出的答案是,感谢所有提供帮助的人。

static void Main(string[] args)
        {
            Hashtable sqlDatatypeholder = new Hashtable();
            DataTable tempTable = new DataTable();
            //Sql Connection      
            string _mySqlUrl = "connection;";
            string _mySqlQuery = "query";

            SqlConnection conn = new SqlConnection(_mySqlUrl);

            using (conn)
            {
                SqlCommand command = new SqlCommand(_mySqlQuery, conn);
                conn.Open();

                SqlDataReader reader = command.ExecuteReader();
                DataTable schemaTable = reader.GetSchemaTable(); //stores datatypes from sql
                tempTable.Load(reader); //stores data rows from sql
                reader.Close();


                if (tempTable != null && tempTable.Rows.Count > 0)
                {
                    foreach (DataRow row in schemaTable.Rows)
                    {
                        sqlDatatypeholder.Add(row["ColumnName"], row["DataTypeName"]);
                    }

                    foreach (DictionaryEntry a in sqlDatatypeholder) {
                        Console.WriteLine(a.Key + " " + a.Value);
                    }

                    Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("Connection Open - No rows found.");
                    Console.ReadLine();
                }
            }
        }

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 2018-07-30
    • 2015-10-09
    • 2016-07-24
    • 2016-06-23
    • 2018-04-05
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多