メモ:SqlDataReader.GetColumnSchema は データ読まないので明らかに暗黙の型変換でエラーが出る場合でもセーフ
タイトル長い…
まあ当然といえば当然なんですが、明らかにダメなやつでも通るとちょっとびっくりする。。
例:文字型の列に 日付型のパラメータ渡す。
using Microsoft.Data.SqlClient; using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { using (var conn = new SqlConnection(@"接続文字列~")) { conn.Open(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = @"select * from sys.columns where name = @from"; cmd.Parameters.Add(new SqlParameter( "@from", System.Data.SqlDbType.DateTime) { Value = DateTime.Now }); using (var reader = cmd.ExecuteReader()) { // データ読むまではエラーが出ない。 foreach (var cs in reader.GetColumnSchema()) { Console.WriteLine(cs.ColumnName); Console.WriteLine(cs.ColumnOrdinal); Console.WriteLine(cs.DataTypeName); } // この↓実行するとエラーがでる。 while (reader.Read()) { Console.WriteLine(reader.GetValue(0)); } } } } Console.ReadKey(); } } }
データ読むとこんなエラー。
メッセージ 241、レベル 16、状態 1、行 1 文字列から日付と時刻、またはそのいずれかへの変換中に、変換が失敗しました。
まあよく考えると、このエラーってこういう時に出るやつで。
select * from [商品] where [文字型の商品コード] = 100
これ商品コードが全部数値に変換出来るだったら、たまたまエラーにならない。
ってのと同じ。
データ型の変換 (データベース エンジン) - SQL Server | Microsoft Docs
暗黙の型変換で上手いこと言ったらセーフってやつ。
※convert_implicit はパフォーマンス上よろしくないので、上手くいっても実はセーフじゃない。。
多分他の DataReader も同じだろうけど、試したのが SQL Server だったので、タイトルは SqlDataReader にしとく。