メモ: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 にしとく。