質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

9443閲覧

DBNull.Valueの扱いについて。

yuki00079

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/10/22 02:09

###前提・実現したいこと
DBNullの値をDBに書き込む際に、一度変数にいれてから処理を行っているのですがその際に下記のエラーが出てしまいます。

###発生している問題・エラーメッセージ

共通型を推論できません。Option Strict Onが設定されている為、・・・。

###該当のソースコード

Dim x As String = "AAA" Dim hoge = If(Not x = "", "AAA", DBNull.Value)

###試したこと

'下記のコードだと問題なし。 Dim x As String = "AAA" Dim hoge = If(Not x = "", CType("AAA", Object), DBNull.Value)

###補足情報
型が推論できないということはDBNull.Valueというのは特殊な型なのでしょうか。また、C#のサンプルコードを調べた際では上記のようなコードで実現できていたようなのですがVBではうまくいきません。C#は不慣れなので読解ミスの可能性もございますが。何が原因なのでしょうか。
また、上記以外の解決策はございますでしょうか。(Option Strict OnをOffにする以外でお願い致します。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

DBNull.Valueは、特殊な型です。と言っても普通のシングルトンなのですが・・・
例えば、代わりに数値を置いても同じエラーになるはずです。

三項演算子で戻り値がStringとDBNull.Valueだとちょっと型の予測が出来ないと言ったところがエラーの原因だと思います。

思うに三項演算子を使わなければ代入特に難しくはないのでは?

VB.NET

1Dim hoge As object = "AAA" 2If hoge = "" then hoge = DBNull.Value

関数を定義しておくという手もあります。これなら、コンパイラに型情報もきちんと伝わるのでエラーにはなりません。
(できれば拡張メソッドでやりたかったのですが、VBではうまく書けませんでした・・・)

shared Function IfEmpty(ByVal aString As String, ByVal atNull as object) as object if aString = "" then return atNull return aString End Function
Dim x As String = "AAA" Dim hoge = IfEmpty(x, DBNull.Value)

投稿2016/10/22 05:52

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki00079

2016/10/25 00:49

返信が遅れてしまい失礼しました。 >三項演算子 こちらの都合で三項演算子は極力使わないようにしております。 コード内でよく利用する処理なので拡張メソッドにて処理していきます。 お力お貸ししていただきありがとうございました。
guest

0

ベストアンサー

以下のようにするということでは目的は果たせませんか?

Dim x As String = "AAA" Dim hoge As Object If Not x = "" Then hoge = "AAA" Else hoge = DBNull.Value End If

投稿2016/10/22 03:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki00079

2016/10/22 04:15

返信ありがとうございます。 記載漏れですが上記の動作は当方で確認済みでございます。 一行でうまくやれる方法がないかと考えております。
退会済みユーザー

退会済みユーザー

2016/10/22 05:09

If 演算子では "AAA" と DBNull.Value の型が違うからダメだと思います。 If 演算子に代えて IIf 関数を使ってはいかがですか? 以下のような感じです。 Dim hoge As Object = IIf(Not x = "", "AAA", DBNull.Value) IIf 関数は第 2、第 3 引数が Object を取るのでうまく行くと思います https://msdn.microsoft.com/ja-jp/library/27ydhh0d(v=vs.90).aspx 質問者さんは C# の ?: 演算子をイメージしていると思いますが、C# でも object hoge = (x != "")? "AAA" : DBNull.Value; は、"AAA" と DBNull.Value の型が違うのでエラーです。MSDN ライブラリの ?: 演算子の説明にはっきりそう書いてあります。 https://msdn.microsoft.com/ja-jp/library/ty67wk28.aspx VB.NET の If 演算子の説明にはそういうことは書いてなかったですが、同じことでは?
yuki00079

2016/10/25 00:51

返信が遅れてしまい失礼しました。 DBNull.Valueは特殊な型のようですね。IIfはこちらの都合で利用しない予定なので拡張メソッドにて対応予定です。
退会済みユーザー

退会済みユーザー

2016/10/25 01:08

DBNull.Value が特殊な型だからダメと言うことではなく、単純に型が違うし、暗黙の型変換も行われないからダメと言うことのはずですが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問