2011-09-19 6 views
10

このように私は、SQLデータベースから取得したデータテーブルを持っている:私はdataColumn.DataTypeを通じて、各列のデータ型を取得しようとするとDataTableの列のSqlTypeを取得する方法は?

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; 
    } 
} 

、私はC#の種類(のInt32、Int64型、文字列などを取得します)。

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

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

答えて

9

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

これは、SQL Server、MySql、Access、PostSQLなどの.NET Connectorを使用していれば、DataTableクラスとDataColumnクラスは常に同じであり、ADO.NETオブジェクトはすべてのdbエンジンので、あなたが見つけたように、列は.NET型で型付けされます。

28

あなたは指定されたSQL列タイプのために終わるだろうあなたは何を入力する.NET示してSQL Serverから.NETに型マッピングの一覧です列の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"]; 
+0

この回答は正しい方法で私を入れました。ありがとうございました! –

+0

あなたは大歓迎です:) – infografnet

+2

残念ながら、SQL Server 2012のドキュメントにはこの機能を使用しないというメモがあります。参照してくださいhttp://msdn.microsoft.com/en-us/library/ms173839.aspx – Naomi

7
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++;}' 
+0

こんにちはMadhukarと歓迎StackOverflow。あなたのコードが何をしているのかを記述してみましょう。これはあなたの答えの質を高め、将来それを読む他の人を助け、より多くのアップフォートを与えるでしょう。詳細については、[回答方法​​](http://stackoverflow.com/questions/how-to-answer)を参照してください。 – bytebuster

+0

SqlDataReader.GetDataTypeName()を使用すると、ネイティブSQL Serverの型が返されます。 SqlDataReader.GetFieldType()は、.NET Frameworkタイプを返します。データベースの列の型やサイズを変更するためにT-SQLステートメントを作成する必要があったときに便利でした。 –

0

あなたはDataReaderを使用している場合 -

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

すると、列

2

のSQLデータ型が必要な場合は別のアプローチは、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); 
      } 
+0

これは、SqlDataTypesの文字列バージョンを返します。 OPは、System.Data.SqlDbType列挙型を探しています。 – JBond

関連する問題