0

一部のオブジェクトをインスタンス化する必要があるため、応答データ リーダー オブジェクトから列名と型を読み取りたいと考えています。私はこれで出てきました:

using (db.sqlConnection) {
    db.sqlConnection.Open();
    using (var cmd = new SqlCommand("areaGetStreetTypes", db.sqlConnection)) {
        cmd.CommandType = CommandType.StoredProcedure;
        using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.KeyInfo)) {
            DataTable dt = dr.GetSchemaTable();
            foreach (DataRow myField in dt.Rows) {
                foreach (DataColumn coloana in dt.Columns) {
                    string c1 = coloana.ColumnName;  //column name ???
                    string c2 = coloana.GetType().ToString(); //column type ??
                    Console.WriteLine(c1 + "  " + c2);
                }
            }
        }
    }
}

しかし、動作していません。各列の戻り値について、次のようなものを(スターター用に)印刷したい:

id_someID int32    
name string    
surname string     
ssn string

私のコードで何が間違っていますか?

4

3 に答える 3

4

Readerにはすでにこれらすべての詳細があるため、各列のデータ型を取得するためにGetSchemaTableを呼び出す必要はありません。

SqlCommand cmd = new SqlCommand(strSql, sqlConn);
SqlDataReader sdr;
sdr = cmd.ExecuteReader();
for (int i = 0; i < sdr.FieldCount; i++)
{
    string dataTypeName = sdr.GetDataTypeName(i); // Gets the type of the specified column in SQL Server data type format
    string FullName = sdr.GetFieldType(i).FullName; // Gets the type of the specified column in .NET data type format
    string specificfullname = sdr.GetProviderSpecificFieldType(i).FullName; //Gets the type of the specified column in provider-specific format
    //Now print the values
}   
于 2012-05-10T08:28:12.097 に答える
3

あなたは実際に次のようなものが欲しいと思います

DataTable dt = dr.GetSchemaTable();
foreach (DataRow myField in dt.Rows) 
{
    var name = myField["ColumnName"];
    var type = myField["DataTypeName"];
    Console.WriteLine("{0} {1}", name, type);
}                     
于 2012-05-10T08:32:19.917 に答える
1

DataColumn.DataTypeプロパティとCommandBehavior.SchemaOnly列挙型メンバーを使用します。

于 2012-05-10T08:21:07.750 に答える