暗黙の型変換とは?

このQ&Aのポイント
  • ASP.NET(C#2.0)からSQLServer2008R2のストアドプロシージャをコールする際、暗黙の型変換を使うとパフォーマンスが落ちるらしいので、全て明示的な型変換に修正したいと思っています。
  • MySQLをselectした値をリーダー(reader)に格納し、SQLServerにストアドコール時にパラメータ指定してinsertするのですが、何が暗黙的で何が明示的なのかわかりません。
  • 暗黙の型変換とは、引数3の型を指定しない場合に起こるという認識で合っていますでしょうか?
回答を見る
  • ベストアンサー

暗黙の型変換をやめたい

ASP.NET(C#2.0)からSQLServer2008R2のストアドプロシージャをコールする際、暗黙の型変換を使うとパフォーマンスが落ちるらしいので、全て明示的な型変換に修正したいと思っています。 MySQLをselectした値をリーダー(reader)に格納し、SQLServerにストアドコール時にパラメータ指定してinsertするのですが、何が暗黙的で何が明示的なのかわかりません。 下記は引数1にパラメータ、引数2にDBType(省略可)、引数3に値を指定しています。 [暗黙的かと思われるパラメータの渡し方] AddParameter("@パラメータ1", reader["値1"]); //char(2) AddParameter("@パラメータ2", DbType.string, reader["値2"].ToString()); //nvarchar(20) [明示的かと思われるパラメータの渡し方] AddParameter("@パラメータ3", DbType.DateTime, Convert.ToDateTime(reader["値3"])); //datetime AddParameter("@パラメータ4", DbType.Currency, (Convert.ToDecimal(reader["値4"])) * 100); //money 暗黙の型変換とは、引数3の型を指定しない場合に起こるという認識で合っていますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • WebSurfer
  • ベストアンサー率55% (33/59)
回答No.1

> 暗黙の型変換とは、引数3の型を指定しない場合に起こるという > 認識で合っていますでしょうか? SQL Server で言う「暗黙の型変換」はそれとは違うと思います。 以下の MSDN ライブラリを参照ください。

参考URL:
http://msdn.microsoft.com/ja-jp/library/ms141260.aspx
yasemaro
質問者

お礼

回答ありがとうございます。 提示頂いたMSDNライブラリを参照しましたが、勉強不足のため理解できませんでした・・・ 式エバリュエーターってなんだろう。。。

関連するQ&A

  • C#で型変換がうまくいきません。

    C#で型変換がうまくいきません。 short r; byte[] b = new byte[] {1,2,3}; r = (short)b[1] * (short)256; というコードを書くと、 型 'int' を 'short' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください) と出てしまいます。キャストしているのに何がいけないのか全くわかりません。 どうぞ宜しくお願いいたします。

  • yyyy/M/dをyyyy/MM/ddに変換

    SQLServer 2005にて文字列型に入っている日付データの変換を行いたいと思っています。 現状yyyy/M/d(2010/1/1)のようになっているのをyyyy/MM/dd(2010/01/01)に変換したい のですが方法が分かりません。 SELECT CONVERT(DATETIME,(CONVERT(VARCHAR(10),テーブルの値)),120) FROM テーブル名 とするとCHAR データ型から DATETIME データ型への変換の結果が日付/時刻の値の範囲外です。 というエラーになっていまいます。どういった方法なら実現できるのでしょうか。 すみませんがご教授ください。 宜しくお願い致します。

  • datetime型でNULL値を入れたい。

    現在SQLserver上で、、CSVを一時テーブルに保管し、ある条件に合致する行のみTBLに追加するというストアドを書いています。そのTBLには「datetime型」の列があります。 この作業で、2点問題が発生しています。 (1)CSVファイルから一時テーブルにデータを入れようとすると、datetime列がNULLの場合、型の不一致でエラーが発生します。 (2)上記において、一時テーブルの型をとりあえずvarcharにしておくと入れれるのですが、TBLに追加しようとする際、「convert(datetime,変数)」としているのですが、上手くキャストしてくれません。(「文字列から日付への変換に失敗しました」のような文がでます) どのようにすれば、NULLでもdatetimeに入れられるのでしょうか?教えてください。

  • C# LinqでDateTime型の値を取得

    C#でLinqを使用し、DateTime型の値を取得しようとしているですが、 DateTime型の変数に格納する際に、以下のようなエラーが発生してしまいます。 'System.DateTime?' を 'System.DateTime' に暗黙的に変換できません。 どうやらDBから取得したDateTimeの値が、「System.DateTime?」という型になっているようなのですが、原因は何でしょうか? また対応方法を教えてください。 尚、DBはSQL Server2005で.Net3.5です 宜しくお願いします。

  • .NET 2003 DateTimeからtime_t型への変換

    .NET 2003 C++です。 フォーム上にカレンダを置いて選択された日時をDateTime型で管理しています。 ところが、途中でどうしても使用しなければいけないクラスへの時間の引数がtime_t型なのです。 その為、DateTimeからtime_tへの変換を模索していますが、よくわかりませんでした。どなたかお知恵をおかしください。 Convertでは、Stringへの変換しか対応してません。 Stringからtime_tへの変換の仕方でもいいんですが。 ※ミリ秒は使用しません。

  • C#による.NETストアドプロシージャ

    VisualStudio+ODT.netで、C#にて「.NETストアドプロシージャ」を製作しようとしています。 例えばNUMBER型の値を引数で渡してNUMBER型値を返す様なFUNCTIONを作りたいとして、 Oracle側で使う際にNUMBER型の値にはNULL値も有り得るわけですが、 C#側でメソッドの引数や戻り値に、NULL許容型(int?やdecimal?とか)を指定してビルドし、 それをVisualStudioからOracleデータベースへデプロイしようとすると、 ウィザード上のパラメータマッピングのところで、NULL許容型に指定した引数や戻り値に対して Oracle側の適切なデータ型を指定出来なくなってしまいます。 かと言って、C#側メソッドでNULL許容型ではない型を指定してしまいますと、引数へNULL値を 与えると例外が発生してしまいます。 この様な問題に直面されて、何らか解決された方はいらっしゃいますでしょうか?

  • SQLServerのストアドで1ヶ月前日付を取得したい

    SQLServer2005のストアドプロシージャで、引数に8桁日付(YYYYMMDD)を受け取り、その1ヶ月前の日付を求めたいのですが、 どのようにすればいいですか? (1)DateAdd関数を使用するために、8桁日付を日付形式に変換する。CONVERT関数使用? (2)(1)で求めた日付形式データでDateAddする。 といった流れだとは思うのですが、実際コードではどう書くのかわかりません。 よろしくお願いします。

  • DateTime型  エラー⇒"date"がサポートされていない

    ASP.NETの勉強をVisualStudio2005を使って勉強しているのですが・・・ データベースの更新・削除のところで日付型を含むテーブルの更新等ができずエラーが出ます。 使用されているSQL Serverのバージョンでは、データ型 'date' がサポートされていません。 と言うエラーを出します。 参考書として使ってる本についていたサンプルのソースでは <asp:Parameter Name="StartDate" Type="DateTime" /> となっているのですが、参考書通りにGridViewなどを配置してSqlDataSourceを参照させても <asp:Parameter DbType="Date" Name="StartDate" /> となります。 一応【DbType="Date"】の箇所を【DbType="DateTime"】に変更してやれば使えるようにはなるのですが、いちいち変更するのはめんどうです。 それと、何故【Type=】ではなく【DbType=】になっているのでしょうか? 開発環境(バージョンとか?)の違いなどでTypeの指定などが勝手に変わってしまっているのでしょうか?

  • アプリから受け取った文字列を日付型に出来ない

    いつもお世話になっています。 タイトルにもあります通り、 アプリから受け取った文字列の日付型変換が上手くいかず失敗します。 状況は下記です。 SQL SERVER 2005に、 アプリから2っの文字列を受け取り、その文字列を日付型に変換し、 日付範囲検索をする。といったストアドを作成しました。 アプリ開発環境はVisualStudio2008、C#のウィンドゥズフォームです。 ストアド自体はManagement Studio上で日付型変換可能な 文字列2っを渡し、単体で実行すると期待通りの動作をします。 しかしアプリから文字列を受け取り実行すると、 「文字列から datetime 型に変換中、変換に失敗しました。」 というエラーがアプリ側に返されます。 しかし、この時アプリが渡す文字列をコピー&ペーストで ManagementStudioのクエリデザイナで実行すると上手く行きます。 アプリから日付変換前の文字列を渡す時に必要な何かが抜けているのでしょうか?ご教授お願いします。 ---ストアドを呼ぶアプリ側--- string kaishibi; string syuryobi; kaishibi += "1753/01/01"; syuryobi += "9999/12/31"; System.Data.SqlClient.SqlCommand hCommand = cSqlConnection.CreateCommand(); hCommand.CommandText = "EXECUTE [ストアド名] kaishibi,syuryobi"; System.Data.SqlClient.SqlDataReader cReader = hCommand.ExecuteReader(); (ここでエラー、「文字列から datetime 型に変換中、変換に失敗しました」) --ストアド側-- ALTER PROCEDURE [ストアド名]  @startData VARCHAR(50),  @endData VARCHAR(50) DECLARE @kaishibi DATETIME, @syuuryoubi DATETIME SET @kaishibi = CONVERT(VARCHAR,@startData,120) SET @syuuryoubi = CONVERT(VARCHAR,@enddata,120) SELECT LOGNO FROM LOG_TBL WHERE DateTime between @kaishibi and @syuuryoubi

  • c# 暗黙/明示的型変換の許容範囲

     こんにちは。毎度皆さんにお世話になっているc#初心者です。  c#にも暗黙/明示的型変換を定義することが出来ますよね? それで、どこまでのものが暗黙の型変換として許容されるかということが疑問になり質問させていただきました。毎度のことですがライブラリ内のクラス・構造体についてです。  例えば、あんまり意味はありませんが、百分率を表す構造体 public struct Percentage {   private int _percentage; }  があり、その内部で public static implicit operator Percentage(int value) { return new Percentage(value); }  程度なら十分許される範囲だと思います(間違っていたらご指摘ください)。  ですが、例えば、「System.Drawing.Color」構造体と同じものを作ったとして、本来「FromName」メソッドで処理するのが妥当と思われる「string」から「Color」への変換を puclic static explicit operator Color(string name) { return FromName(name); }  のようにしてしまうのはまずいのでしょうか? 多分まずいですよね。だとすると、どの程度の変換がボーダーラインなのか(出来れば具体例もあれば助かります)知りたいのですが、どなたか詳しい方はいらっしゃいませんか?

専門家に質問してみよう