C#でデータ取得時のエラーに関して

このQ&Aのポイント
  • C#でデータを取得する際にオブジェクトのキャストエラーが発生してしまう問題について教えてください。
  • 変数に代入する段階でデータの存在がなくてもエラーが発生してしまう理由を教えてください。
  • データベースからデータを取得する際に起こる型の不一致エラーについて教えてください。
回答を見る
  • ベストアンサー

データ取得時のエラーに関して

教えて下さい。 以下のようにC#で記述し、ODBC接続で単純にデータを取得するだけのものですが、 変数に代入する段階でエラーとなってしまいます。 取得項目がたまたまデータが存在しないという事だけですが、データがないからといって エラーにはならないと思いますが。。。 尚、エラーの内容は、  型 'System.DBNull' のオブジェクトを型 'System.String' にキャストできません。 というエラーです。 初歩的な事で申し訳ありませんが、教えて下さい。 《記述内容》 int mst_cnt = 0; int cLoop = 0; string[] A; string[] B; string message; A = null; B = null; OdbcConnection cn; string MyString,Mycnt; MyString = "SELECT 明細マスタ.A," + "明細マスタ.B," + " FROM 明細マスタ," + "発注明細データ," + "発注データ" + " WHERE 発注データ.発注番号 = 発注明細データ.発注番号" + " AND 発注明細データ.部品番号 = 明細マスタ.部品番号"; Mycnt = "SELECT COUNT(*) " + " FROM 明細マスタ," + "発注明細データ," + "発注データ" + " WHERE メカ部品発注データ.発注番号 = メカ部品発注明細データ.発注番号" + " WHERE 発注データ.発注番号 = 発注明細データ.発注番号" + " AND 発注明細データ.部品番号 = 明細マスタ.部品番号"; cn = new OdbcConnection("Driver={Microsoft ODBC for Oracle};Server=MRDKIKAN;" + "UID=MRDKIKAN;PWD=MRDKIKAN"); OdbcCommand cmd = new OdbcCommand(MyString, cn); OdbcCommand cmdcnt = new OdbcCommand(Mycnt, cn); cn.Open(); try { OdbcDataReader reader = cmdcnt.ExecuteReader(); reader.Read(); mst_cnt = reader.GetInt32(0); 図面番号 = new string[mst_cnt]; 部品名 = new string[mst_cnt]; reader.Close(); reader = cmd.ExecuteReader(); while (reader.Read() == true) { 図面番号[cLoop] = reader.GetString(0); 部品名[cLoop] = reader.GetString(1);  ← ここでエラーとなってしまいます!! cLoop += 1; } } catch (Exception ex) { message = ex.Message; return; } //MySQL切断 cn.Close();

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

  • ベストアンサー
回答No.1

http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcdatareader.getstring.aspx >Conversions are performed based on the underlying capabilities of the ODBC driver. >If the conversion is not supported, the method call fails. >Call IsDBNull to look for null values before calling this method. このメソッドを呼ぶ前に、IsDBNullメソッドを呼んでnull値かどうか確認しろ、ってリファレンスに書いてある #そして、必要があれば分岐するコードを自分でかけ、ってことだと思う

yurix_1
質問者

お礼

ありがとうございました。 教えて頂いた内容をヒントにようなく解決しました。 ありがとうございました!!

yurix_1
質問者

補足

ご回答ありがとうございます。 教えて頂いたように、IsDBNull関数を使用し、以下のように記述しましたが、 それでもエラーが消えません。。。 エラーの内容は同じです。 何が原因でしょうか??? 《記述内容》 if (Convert.IsDBNull(reader.GetString(2))) { 二次加工[cLoop] = ""; } else { 二次加工[cLoop] = reader.GetString(2); } 教えて下さい。

関連するQ&A

  • SQLServerデータをDataGridに表示時にエラーが発生

    SQLServerデータをDataGridに表示時にエラーが発生 visual Studio2008を使用し、SQLServerから条件を指定しそれをDataGridに一覧表示するvbを組んでいますが、エラーが解消しなく困っております。対応方法について教えてください。 【状況】 1 Dim St As String 2 Dim Cn As New System.Data.SqlClient.SqlConnection 3 Dim SQL As System.Data.SqlClient.SqlCommand 4 Dim ServerName As String = "Server名"  5 Dim UserID As String = "id" 6 Dim Password As String = "×××" 7 Dim DatabaseName As String = "Dbname" 8 Dim Adapter As New SqlClient.SqlDataAdapter(SQL, Cn) 9 Dim table As New DataTable 10 St = "Server=" & ServerName & ";" 11 St &= "User ID=" & UserID & ";" 12 St &= "Password=" & Password & ";" 13 St &= "Initial Catalog=" & DatabaseName 14 Cn.Open() 15 Cn.ConnectionString = St 16 SQL = Cn.CreateCommand 17 SQL.CommandText = ("SELECT * FROM CUSTOMER_M WHERE CUSTOMER_NAME LIKE " & "'%' & TextBoxName.Text & '%'") 18 Adapter.Fill(table) 19 DataGrid1.DataSource = table 20 Cn.Close() 21 SQL.Dispose() 22 Cn.Dispose() 8行目の「Adapter」がエラーになり、オーバーロードの解決に失敗しましたとメッセージが出ています。8行目の(SQl、Cn)を省くとコンパイルエラーはなくなりますが、14行目でエラーになります。 宜しくお願いします。

  • データセットへの取得について

    VB2005はじめたばかりです。 MDBからデータを抽出してデータセットへのところでエラーとなります。 Private Sub Button1_Click Dim dAdp As OleDb.OleDbDataAdapter Dim dSet As DataSet = New DataSet("t_社員") Dim cn As OleDb.OleDbConnection _ = New OleDb.OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=C:\VB2005\SampleDB.mdb;") dAdp = New OleDb.OleDbDataAdapter("SELECT * FROM 社員 where 社員番号=>101", cn) dAdp.Fill(dSet, "t_社員") ★ここでエラーとなってしまいます。【where 社員番号=>101", 】をトルと正常となります。 恐れ入りますがご指摘いただけますでしょうか。

  • VB.NET DataReaderが開かれている

    おはようございます。 今回はVB.NETについて質問させてください。 【開発環境】 ・VB.NET(Visual Studio2010) ・PostgreSQL8.3 ・WindowsXP 【質問内容】 ある一定の操作をすると、 『この Command に関連付けられている DataReader が既に開かれています。このコマンドを最初に閉じる必要があります』 とエラーが出てしまい、例外で落ちてしまいます。 【落ちる原因の操作】 1.メインフレームを起動 2.親品番マスタから取得した親品番一覧を表示しているListViewの1件をダブルクリック 3.親品番に紐付いている子品番を品番テーブルから取得 4.表示内容の切り替えラジオボタンを全て⇒図面ありに変更 5.表示内容の切り替えラジオボタンを図面あり⇒全てに変更 6.表示内容の切り替えラジオボタンを全て⇒図面ありに変更 7.表示内容の切り替えラジオボタンを図面あり⇒全てに変更←ここで先ほどの例外が発生する。 【該当部分のソース】 Private Sub ArticleTableUpdate(ByVal sParents As String) Dim articleResult As Odbc.OdbcDataReader ' 品番テーブル用 Dim articleSql As String Dim zumenSql As String Dim sChild As String Dim articleCount As Integer Dim zumenCount As Integer Dim zumenFlag As String ' 品番テーブルからデータを取得するSQLを作成 articleSql = "SELECT * FROM ""ARTICLE_TBL"" WHERE ""P_ARTICLE_NUMBER"" = '" + sParents + "'" Debug.WriteLine("【ArticleTableUpdate】 品番テーブルからデータを取得SQL:" + articleSql) ODBCCommand.CommandText = articleSql ' 品番テーブルから該当の親品番のデータ件数を取得 'articleCount = ODBCCommand.ExecuteNonQuery() ' 品番テーブルに該当の親品番のデータが存在するか 'If articleCount = 0 Then 'Exit Sub 'End If ' 品番テーブルから該当の親品番のデータを取得 articleResult = ODBCCommand.ExecuteReader() ←ここで例外発生 ' 取得した件数分処理 While articleResult.Read() ' 子品番データを取得 sChild = articleResult("C_ARTICLE_NUMBER").ToString If sChild <> "" Then ' 子品番データをキーに図面マスタからデータを取得するSQLを作成 zumenSql = "SELECT * FROM ""ZUMEN_MST"" WHERE ""PLAN_NUMBER"" = '" + sChild + "'" Else sParents = articleResult("P_ARTICLE_NUMBER").ToString zumenSql = "SELECT * FROM ""ZUMEN_MST"" WHERE ""PLAN_NUMBER"" = '" + sParents + "'" End If Debug.WriteLine("【ArticleTableUpdate】 図面マスタからデータを取得SQL:" + zumenSql) ODBCCommand2.CommandText = zumenSql ' 図面マスタから該当の品番のデータの件数を取得 zumenCount = ODBCCommand2.ExecuteNonQuery ' 図面マスターに該当の品番のデータが存在するか If zumenCount = 0 Then ' 図面データが存在しない為、更新値を0とする zumenFlag = "0" Else ' 図目データが存在する為、更新値を1とする zumenFlag = "1" End If ' 品番テーブルを更新するSQLを作成 zumenSql = "UPDATE ""ARTICLE_TBL"" " + vbCrLf + "SET " + vbCrLf + vbTab + """C_ARTICLE_NUMBER"" = '" + sChild + "', " + vbCrLf + vbTab + """PLAN_FLAG"" = '" + zumenFlag + "', " + vbCrLf + vbTab + """UPDATE_DATE"" = '" + Today + "'" + vbCrLf + "WHERE ""P_ARTICLE_NUMBER"" = '" + sParents + "'" Debug.WriteLine("【ArticleTableUpdate】 品番テーブルを更新するSQL:" + zumenSql) ODBCCommand2.CommandText = zumenSql ' 品番テーブルを更新 zumenCount = ODBCCommand2.ExecuteNonQuery() End While articleResult.Close() ODBCCommand = New Odbc.OdbcCommand ODBCCommand.Connection = ODBCSession End Sub 【DB接続関数】 Public Function ODBC_CONNECT() As Boolean ' 戻り値をセット ODBC_CONNECT = False If ConnectFlag = False Then Try ODBCSession = New Odbc.OdbcConnection ODBCCommand = New Odbc.OdbcCommand ODBCCommand2 = New Odbc.OdbcCommand ' データベース接続情報 ODBCSession.ConnectionString = "Provider=MSDASQL;DSN=HOGE;UID=hogeU;PWD=hogeP;" ODBCCommand.Connection = ODBCSession ODBCCommand2.Connection = ODBCSession ' データベースに接続 ODBCSession.Open() ConnectFlag = True ODBC_CONNECT = True Catch Debug.WriteLine("えらー") End Try End If End Function 今のところ、このエラーが発生した場合、再起動すると発生しなくなるみたいです。(たまたまそうなったのかもしれません) 何か原因がわかる方、ご教授お願い致します。

  • アクセスで2つのコードから1つのデータを引き出したい

    アクセス2003で工程管理のデータベースを作っています。うまく説明できなくて申し訳ないのですが、ふたつのコードからひとつのデータを引き出したいのですが、どうしたらよいか分からないので、どなたか教えてください。 ○テーブル「部品マスタ」 部品番号 部品名 ○テーブル「工程マスタ」 工程番号 工程名 ○テーブル「受注マスタ」 受注番号 部品番号 工程番号 ○テーブル「日数マスタ」 日数ID 部品番号 工程番号 日数 となっています。 テーブル「受注マスタ」の部品番号と工程番号からテーブル「日数マスタ」にある日数を引き出したいのですが、方法が分からず質問しました。

  • VB2008フォームのコンボボックスに、MSSQL2008のデータを表

    VB2008フォームのコンボボックスに、MSSQL2008のデータを表示させたい いつもお世話になっております。 以前、VB6を少しかじり、 最近、サンプルコードなどを見よう見まねでvb2008&MSSQL2008について勉強しております。 VB2008で作成したフォームからMSSQLサーバ2008に接続し、 フォームをロードした際、フォーム上にあるコンボボックス(Combobox1)に サーバの指定したテーブル・フィールドの値を表示させたいのですが、 データベースへの接続はできたものの、コンボボックスに表示させる方法がわかりません。 テーブル:社員マスタ フィールド:社員番号 のデータをコンボボックスに呼び出すにはどう処理を加えればよいでしょうか? 今現在、作成中のコードが下記になります。 ご教授お願いします。 Private Sub Frmjob_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'リモート接続に伴うパスを格納 Dim St As String Dim Cn As New System.Data.SqlClient.SqlConnection Dim sqlInsert As New SqlClient.SqlCommand Dim SQL As System.Data.SqlClient.SqlCommand Dim ServerName As String = "192.XXX.X.XX" 'サーバーのIPアドレス Dim UserID As String = "sa" 'ユーザーID Dim Password As String = "bluebird" 'パスワード Dim DatabaseName As String = "testDB" '接続先データベース St = "Server=" & ServerName & ";" St &= "User ID=" & UserID & ";" St &= "Password=" & Password & ";" St &= "Initial Catalog=" & DatabaseName Cn.ConnectionString = St SQL = Cn.CreateCommand 'データベースに接続 Cn.Open() 'サーバから呼び出し SQL = New SqlClient.SqlCommand("SELECT 社員番号 FROM 社員マスタ"'), Cn)     Me.ComboBox1.Items.Add(Item("JobCode")) Cn.Close() SQL.Dispose() Cn.Dispose() End Sub

  • ASP.NETで Web.Configの定義がエラーになります。

    Web.configに以下の定義 (フォームでSqlDataSouceを貼り付けて定義) <add name="TestdateConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Inetpub\wwwroot\Test\App_Data\Test.mdb" providerName="System.Data.OleDb" /> 次にフォームのVB側で以下のサブルーチンを作成 (TestConnectionString)で定義がされていませんなる エラーがでます。定義はしているのですが何故でしょうか? 教えて下さいよろしくお願いいたします。 Protected Sub updateTimestamp(ByVal syouhinCD As String, ByVal updateFieldName As String, ByVal updateData As String) Using connection As New System.Data.Odbc.OdbcConnection(TestConnectionString) Dim updateCommand As String updateCommand = ("UPDATE Test SET {1} = Now(), {2} = 'dummy' WHERE({4} = 42)") Dim command As System.Data.Odbc.OdbcCommand = New System.Data.Odbc.OdbcCommand(updateCommand, connection) connection.Open() command.ExecuteNonQuery() connection.Close() End Using End Sub

  • コンパイル時にエラーが出てしまいます・・・

    btn2.setEnabled(false); btn3.setEnabled(false); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int t0 = 0; if (txt1.getText().length() == 4 ){ try{ String drv = "org.postgresql.Driver"; String url = "jdbc:postgresql:postgres"; String usr = "postgres"; Class.forName(drv); Connection cn = DriverManager.getConnection(url, usr); Statement st = cn.createStatement(); String qry1 = "SELECT * FROM getuji WHERE 年度 = '1984';"; ResultSet rs = st.executeQuery ( qry1 ); while(rs.next()){ t0 = rs.getInt("年度"); } st.close(); cn.close(); } catch(Exception f){f.printStackTrace();} } else{ btn3.setEnabled(true); } if (t0 != 0 ){ btn2.setEnabled(true); } else{ btn3.setEnabled(true); } } }); btn1を押すとDBへ問合せ、データが有る場合はbtn2が使えるようになり、データがない場合はbtn3が使えるようになる、という風にしたいのですが、コンパイル時に intは間接参照できません。 if (t0 != 0 ){ とエラーた出てしまいます。何がいけないのでしょうか? 以前、聞いたやり方でやったのですがうまくいきませんでした。 http://okwave.jp/qa4452155.html 同じ質問をするのは申し訳なく思うのですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • Excel実行時エラー[80004005]について

    ExcelのVBAにてSQLのSELECT文を実行し、取得したデータを一覧表示する仕組みを作っています。 同じプログラムを使用者する者7名の内、1名のみ以下のエラーが発生しています。 どのように対応すればよいか、ご教示ください。 環境 Excel2010 状況 SELECTの実行時 「実行時エラー[80004005] [Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバーが見つかりません。」 実行ソース Private Sub exeSelect(sheetNm as string ,sqlSt as String) Dim i As Integer Dim j As Integer Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim bookNm As String bookNm = ThisWorkbook.FullName Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & bookNm & "; ReadOnly=False;" cn.Open←ここでエラー Set rs = New ADODB.Recordset rs.Open sqlSt, cn, adOpenStatic j = START_ROW Do Until rs.EOF For i = 0 To rs.Fields.Count - 1 Worksheets(sheetNm).Cells(j, i + 1).Value = rs(i).Value Next j = j + 1 rs.MoveNext Loop rs.Close cn.Close End Sub

  • コンボボックスに取得したレコードデータを表示したい

    環境:winxp、vb6、access2000 以下の様にアクセスから抽出したレコード"rstdata"をCombo1のデータソースに指定してコンボボックスに表示したいのですが、何も表示されません。 原因が分かる方がいらっしゃればご教示ください。 *******コード******** Dim cn As New ADODB.Connection Dim cmd As ADODB.Command Dim rstdata As ADODB.Recordset Dim strSQLdata As String Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Persist Security Info=False;" & _ "Data Source=aaa.mdb;" & _ "Mode=Read" cn.Open Set rstdata = New ADODB.Recordset strSQLdata = "Select 項目名 From T_SHIKENDATA order by ID" rstdata.Open strSQLdata, cn, adOpenStatic Set Combo1.DataSource = rstdata rstdata.Close Set rstdata = Nothing cn.Close Set cn = Nothing

  • EXCELのリストのデーターを別の書類にリンク

    どこに質問していいのかわからなくてこのカテゴリにしました。 EXCELのリストのデータ(A列に番号、B列に部品名、C列に型式、D列に発注日、E列に発注先、F列にメーカー、G列は備考)を、別の書類(注文書)にリンクさせたいです。現状、Sheet1に上記データの部品リスト。sheet2に注文書(データ部は空欄)。注文書を作る時、Sheet1のE列に部品ごとに発注先を手入力→同じ発注先でソートをかける→発注日を入力→その部品データ(番号、部品名など)をコピーしてsheet2の注文書のデータ空欄部に貼り付け。注文書の列の並び(A列に番号…)はSheet1と同じ。注文書の宛名欄のセルには、E列の発注先と同じなので、=(E列の)セル番号 にしている。量が少なければこの方法で十分なのですが、1000点くらい注文したい時が大変です。元の部品リスト(Excel)がユニットごとに分かれてるので、Excelリストが60枚ある。 大企業ならこんな発注システムではないと思います。事務作業は極力簡単にしたいのです。アドバイスを是非是非お願い致します。

専門家に質問してみよう