web-dev-qa-db-ja.com

DataTableの列のSqlTypeを取得する方法

次のように、SQLデータベースから取得したDataTableがあります。

using (SqlCommand cmd = new SqlCommand(query, _sqlserverDB))
{
    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
    {
        DataSet dataSet = new DataSet();
        adapter.Fill(dataSet);
        result = (dataSet != null && dataSet.Tables != null && dataSet.Tables.Count > 0) ? dataSet.Tables[0] : null;
    }
}

DataColumn.DataTypeを介して各列のDataTypeを取得しようとすると、C#タイプ(Int32、Int64、Stringなど)が取得されます。

QUESTION: C#型ではなくネイティブSQLデータ型(varchar、nvarchar、bigint ...)にアクセスするにはどうすればよいですか?

DataColumn.DataType.UnderlyingSystemTypeを試しましたが、結果は同じです。

19
DarthRoman

System.Data.DataTable(またはDataColumn、またはDataSet、またはDataRow...)は、ロードした特定のデータベースエンジンに関係なく同じように機能する汎用.NETデータコンテナーです。あなたのデータ。

これは、SQL Server、MySQL、Access、PostgreSQLなどの.NETコネクタを使用した場合、DataTableおよびDataColumnクラスは常に同じであり、ADO.NETオブジェクトは汎用であることを意味します任意のdbエンジンで機能するため、列は.NETタイプで型付けされます。

10
Davide Piras

もちろん、列のSqlDbTypeを取得することは可能です。答えはSOにあります link

SqlCommand cmd = connection.CreateCommand();
cmd.CommandText = "SET FMTONLY ON; select column from table; SET FMTONLY OFF";
SqlDataReader reader = cmd.ExecuteReader();
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"];
33
infografnet
SqlConnection SqlCon = new SqlConnection("Data Source=(local);Database=  dbname;Integrated Security=SSPI;");

SqlDataReader SqlDr;

SqlCon.Open();
SqlCmd = SqlCon.CreateCommand();

SqlCmd.CommandText = "select * from Tablename";

SqlDr = SqlCmd.ExecuteReader();
SqlDr.Read();
int i=0;
while (i < SqlDr.FieldCount)
{ MessageBox.Show(SqlDr.GetDataTypeName(i)); i++;}'
8

もう1つのアプローチは、SQLに作業を任せることです。

SqlConnection rConn = connectToSQL(); //returns sql connection
SqlCommand SqlCmd = new SqlCommand();
SqlCmd = rConn.CreateCommand();
SqlCmd.CommandText = "SELECT ORDINAL_POSITION, " +
                         "COLUMN_NAME, " +
                         "DATA_TYPE, " +
                         "CHARACTER_MAXIMUM_LENGTH, " +
                         "IS_NULLABLE " +
                    "FROM INFORMATION_SCHEMA.COLUMNS " +
                    "WHERE TABLE_NAME = 'TableName'";
SqlDataReader SqlDr = SqlCmd.ExecuteReader();
SqlDr.Read();
while (SqlDr.Read()) { 
    var OrdPos = SqlDr.GetValue(0);
    var ColName = SqlDr.GetValue(1);
    var DataType = SqlDr.GetValue(2);
    var CharMaxLen = SqlDr.GetValue(3);
    var IsNullable = SqlDr.GetValue(4);
    Console.WriteLine("ColName - " + ColName + " DataType - " + DataType + " CharMaxLen - " + CharMaxLen);
}
4
chaos10

デビッドが言うように...あなたは.NETにいるので、型は.NET型になります。これは、SQL Serverから.Netへの型マッピングのリストであり、特定のSQL列型に対してどの.NET型になるかを示しています。これが役立つことを願っています。

http://msdn.Microsoft.com/en-us/library/ms131092.aspx

2
iDevForFun

Madhukar Krishnaの答えに基づいて、SQLDataReaderまたはMySQLDataReaderオブジェクトがある場合、指定された列のSQLタイプのメタデータを取得できます(コードでは、インデックス1の列のメタデータを取得します)次のコードを使用します(MySQLDataReaderオブジェクトで機能する例):

_...
MySqlDataReader dr = ...
Console.WriteLine("dr.GetFieldType(1) = {0}, dr.GetName(1) = {1}, dr.GetValue(1) = {2}, dr.GetDataTypeName(1) = {3}", 
                          dr.GetFieldType(1), dr.GetName(1), dr.GetValue(1), dr.GetDataTypeName(1));
        bool b = Enum.TryParse(dr.GetDataTypeName(1), true, out System.Data.SqlDbType mySqlDbTypeEnum);
        Console.WriteLine("mySqlDbTypeEnum = {0}, b = {1}", mySqlDbTypeEnum, b);
_

この線:

_bool b = Enum.TryParse(dr.GetDataTypeName(1), true, out System.Data.SqlDbType mySqlDbTypeEnum);
_

Stringから_System.Data.SqlDbType_を取得するために使用され、大文字と小文字の区別は無視されます。 dr.GetDataTypeName(1)が_"VARCHAR"_を返す場合、_System.Data.SqlDbType_列挙値は_System.Data.SqlDbType.VarChar_です。

次に、次のコードでSQL列のメタデータを検査することにより、データ型のサイズ(たとえば、VARCHAR(15))を取得できます(ソース [〜#〜] msdn [〜#〜] ):

_... (continuation)
DataTable schemaTable;
// Retrieve column schema into a DataTable.
schemaTable = dr.GetSchemaTable();
// For each field in the table...
foreach (DataRow myField in schemaTable.Rows)
{
   // For each property of the field...
   foreach (DataColumn myProperty in schemaTable.Columns)
   {
      // Display the field name and value.
      Console.WriteLine(myProperty.ColumnName + " = " + myField[myProperty].ToString());
   }
   Console.WriteLine();
   // Pause.
   //Console.ReadLine();
}
_

プロパティColumnSizeはサイズ情報を提供します。

0
Nuno Leite

DataReaderを使用している場合-

SqlDataReader reader = cmd.ExecuteReader(); reader.GetDataTypeName(int ordinal)

列のSQLデータ型が必要な場合は機能するはずです

0
ManJan