-1

伙计们,我有一条 SQL 语句返回超过 1 个值。我正在尝试使用 StreamReader 将值放入数组中,如下所示

 string sql = "select distinct COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME=' " + table + "' and CONSTRAINT_NAME like 'PK_%'";
            SqlConnection conn2 = new SqlConnection(cnstr.connectionString(cmbDatabase.Text));
            SqlCommand cmd_server2 = new SqlCommand(sql);
            cmd_server2.CommandType = CommandType.Text;
            cmd_server2.Connection = conn2;
            conn2.Open();

            //reader_sql = new StreamReader();
            SqlDataReader reader_sql = null;
            string[] colName = new string[200];
            reader_sql = cmd_server2.ExecuteReader();
            while (reader_sql.Read());

            for (int rr = 0; rr < 20; rr++)
            {
                colName[rr] = reader_sql["COLUMN_NAME"].ToString();
            }

它不起作用,我做错了什么?

4

3 回答 3

3

你有一个流浪者;把你while变成一个紧密的循环,所以试试:

        while (reader_sql.Read())

        for (int rr = 0; rr < 20; rr++)
        {
            colName[rr] = reader_sql["COLUMN_NAME"].ToString();
        }
于 2013-09-02T07:58:34.103 回答
2

也许您应该删除 Read 末尾的分号

while (reader_sql.Read())
{
    for (int rr = 0; rr < 20; rr++)
       colName[rr] = reader_sql["COLUMN_NAME"].ToString();
}    

但是,如果您的意图是检索属于主键的列,那么您的代码是错误的,因为您添加了 20 次相同的主键列,然后对以 20 个字符串数组结尾的其余列重复相同的操作,全部等于主键集中的最后一列。我认为您应该更改代码以使用 List(Of String) 而不是固定长度的数组,并让阅读器在检索到的主键列上正确循环

List<string> pks = new List<string>();
while (reader_sql.Read())
{
    pks.Add(reader_sql["COLUMN_NAME"].ToString());
}    

编辑:我刚刚注意到您的查询在表名之前包含一个空格。然后字符串连接会产生一个无效的表名,查询在语法上是正确的,但不返回任何数据

string sql = "select distinct COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE " + 
             "where TABLE_NAME='" + table + "' and CONSTRAINT_NAME like 'PK_%'";
                                ^ space removed here

当您使用它时,删除字符串连接并使用参数化查询.....

string sql = "select distinct COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE " + 
             "where TABLE_NAME=@tName and CONSTRAINT_NAME like 'PK_%'";
SqlCommand cmd_server2 = new SqlCommand(sql, connection);
connection.Open();
cmd_server2.Parameters.AddWithValue("@tName", table);
于 2013-09-02T07:58:58.913 回答
2

你得到了例外,因为

while (reader_sql.Read());

应该

while (reader_sql.Read())
{
    for (int rr = 0; rr < 20; rr++)
     {
         colName[rr] = reader_sql["COLUMN_NAME"].ToString();
     }
}
于 2013-09-02T08:00:22.813 回答