-1

みんな私は複数の値を返す SQL ステートメントを持っています。以下のように、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 に答える