C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: データ件数の取得


(過去ログ 64 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■36680 / inTopicNo.1)  データ件数の取得
  
□投稿者/ EarthIsland (4回)-(2009/06/03(Wed) 16:21:38)

分類:[.NET 全般] 

質問します。
select Count(列名)〜で取得したAccessテーブルの件数を
Int型で取得したいのですが、うまくいきません。
「型;Object型をint型に暗黙的に変換できません。」というバグになります。
どうか手ほどきを
よろしくお願いします。


public static System.Data.OleDb.OleDbConnection gobjOLECnc=new System.Data.OleDb.OleDbConnection();
public static System.Data.OleDb.OleDbCommand gobjOLECmd=new System.Data.OleDb.OleDbCommand();
public static System.Data.OleDb.OleDbDataAdapter gobjOLEAdapter=new System.Data.OleDb.OleDbDataAdapter();
public static System.Data.OleDb.OleDbDataReader gobjOLEReader;
public static System.Data.OleDb.OleDbTransaction gobjTrans;


public static int gfncSQLLngGetCount(string strTBLName, string strFLDName, string strwhere)
{
string strSQL="";
System.Data.DataTable objDtTBL=new System.Data.DataTable();
strSQL=strSQL + "Select ";
strSQL=strSQL + " Count(" + strFLDName + ") As CountID ";
strSQL=strSQL + "From ";
strSQL=strSQL + " " + strTBLName + "";
strSQL=strSQL + "where ";
strSQL=strSQL + " " + strwhere + ";";
try
{
gvoidGetConnectionString();
gobjOLECnc.Open();
gobjOLECmd=new System.Data.OleDb.OleDbCommand(strSQL,gobjOLECnc);
gobjOLEAdapter = new System.Data.OleDb.OleDbDataAdapter(gobjOLECmd);
gobjDTSet=new System.Data.DataSet(strTBLName);
//gobjOLEAdapter.Fill(gobjDTSet, strTBLName);
gobjOLEAdapter.Fill(objDtTBL);
gobjDTRow = objDtTBL.Rows[0];
return objDtTBL.Rows[0][0];//ここでエラーになります。

}
catch (Exception objEx)
{
System.Windows.Forms.MessageBox.Show(objEx.ToString());
}
finally
{
gobjOLECnc.Close();
}

}
引用返信 編集キー/
■36682 / inTopicNo.2)  Re[1]: データ件数の取得
□投稿者/ .SHO (847回)-(2009/06/03(Wed) 16:33:25)
キャストじゃダメ?

return (int) objDtTBL.Rows[0][0];
引用返信 編集キー/
■36683 / inTopicNo.3)  Re[1]: データ件数の取得
□投稿者/ カドルドエグ (87回)-(2009/06/03(Wed) 16:39:04)
No36680 (EarthIsland さん) に返信
>System.Data.DataTable objDtTBL=new System.Data.DataTable();

変数:objDtTBLは型無しのDataTableとして宣言されていますね。
型無しのDataTableからは

>objDtTBL.Rows[0][0];

とするだけでは、
セット先ですべてobject型となってしまっているため
質問者さんが想定している型では取得できません。
そのため、.SHOさんが提示しているように変換(今回の場合はint型に)が必要になります。


引用返信 編集キー/
■36684 / inTopicNo.4)  Re[2]: データ件数の取得
□投稿者/ aetos (150回)-(2009/06/03(Wed) 16:43:39)
No36682 (.SHO さん) に返信
> キャストじゃダメ?
>
> return (int) objDtTBL.Rows[0][0];

objDtTBL.Rows[0][0] の中身の型が何になるかをよく確認してからの方がいいですよ。

このコードは実行できますが、
decimal d = 10M;
int i = ( int )d;

このコードは InvalidCastException を吐いて落ちます。
decimal d = 10M;
object o = d;
int i = ( int )o;

これならいけます。
decimal d = 10M;
object o = d;
int i = ( int )( decimal )o;

って言うか、素直に型付きデータセットを使うか、せめて明示的に DataColumn に型指定しましょう。
引用返信 編集キー/
■36685 / inTopicNo.5)  Re[3]: データ件数の取得
□投稿者/ .SHO (848回)-(2009/06/03(Wed) 16:49:42)
> objDtTBL.Rows[0][0] の中身の型が何になるかをよく確認してからの方がいいですよ。

select count(…) …

で返される値なら int じゃないかと?

# 確認してませんが。。。
引用返信 編集キー/
■36687 / inTopicNo.6)  Re[4]: データ件数の取得
□投稿者/ みきぬ (455回)-(2009/06/03(Wed) 17:16:13)
単に件数を取得するだけであれば、DataTable を使わなくても gobjOLECmd.ExecuteScalar() でいいんじゃない?

# キャストはしてね。
引用返信 編集キー/
■36692 / inTopicNo.7)  Re[4]: データ件数の取得
□投稿者/ aetos (151回)-(2009/06/03(Wed) 21:31:29)
No36685 (.SHO さん) に返信
>>objDtTBL.Rows[0][0] の中身の型が何になるかをよく確認してからの方がいいですよ。
>
> select count(…) …
>
> で返される値なら int じゃないかと?
>
> # 確認してませんが。。。

OleDB がどうかは知りませんが、ODP.NET では decimal でした。
引用返信 編集キー/
■36699 / inTopicNo.8)  Re[5]: データ件数の取得
□投稿者/ EarthIsland (5回)-(2009/06/04(Thu) 01:00:05)
>■No36682
>■No36683

return (int) objDtTBL.Rows[0][0];
としたら、
「値を返さないコード パスがあります」というバグで、
gfncSQLLngGetCountの文字を指摘されてしまいました。
まだ模索中です。

VB.Netでは下記のようにコーディングしました。(gobj〜は既にグローバル変数として宣言済みです)
'*-----------------------------------------------------------------------------
'* 名前 :gfncSQLLngGetCount
'* 記述 :カウントクエリ
'* パラメータ
'* ・strTBLName :テーブル名
'* ・strFLDName :カウントする列
'* ・strWhere :条件
'* 戻り値 :長整数型数値
'* 作成者 :---
'* 変更 :2007/05/15
'*-----------------------------------------------------------------------------
Public Function gfncSQLLngGetCount(ByVal strTBLName As String, ByVal strFLDName As String, Optional ByVal strwhere As String = "") As Long
Dim objDTTBL As New DataTable()
On Error GoTo Err_Trap
gfncSQLLngGetCount = 0
Call gsubGetConnectionString()
Call gobjOLECnc.Open()
gobjOLECmd = New OleDb.OleDbCommand("Select Count(" & strFLDName & ") As CountID From " & strTBLName & " where " & strwhere & ";", gobjOLECnc)
gobjOLEAdapter = New OleDb.OleDbDataAdapter(gobjOLECmd)
Call gobjOLEAdapter.Fill(objDTTBL)
gobjDTRow = objDTTBL.Rows(0)
If objDTTBL.Rows.Count = 1 Then
If IsDBNull(gobjDTRow("CountID")) = False Then
gfncSQLLngGetCount = gobjDTRow("CountID")
End If
End If
Call gobjOLECnc.Close()
Exit_Trap:
Exit Function
Err_Trap:
Call gsubDspMessByErrNumber(Err.Number, Err.Description)
GoTo Exit_Trap
End Function



No36692 (aetos さん) に返信
> ■No36685 (.SHO さん) に返信
> >>objDtTBL.Rows[0][0] の中身の型が何になるかをよく確認してからの方がいいですよ。
>>
>>select count(…) …
>>
>>で返される値なら int じゃないかと?
>>
>># 確認してませんが。。。
>
> OleDB がどうかは知りませんが、ODP.NET では decimal でした。
引用返信 編集キー/
■36702 / inTopicNo.9)  Re[6]: データ件数の取得
□投稿者/ やじゅ (1026回)-(2009/06/04(Thu) 07:16:54)
やじゅ さんの Web サイト
No36699 (EarthIsland さん) に返信

みきぬ さんがご指摘されてるけど、1項目しか返さないなら、
DataAdapterを使わないで、ExecuteScalarにすればいい

//スカラー値を取得します
object obj = cmd.ExecuteScalar();
count = (int)obj;

http://genz0.blogspot.com/2009/02/netcsvoledb.html

引用返信 編集キー/
■36706 / inTopicNo.10)  Re[7]: データ件数の取得
□投稿者/ らじうむ (7回)-(2009/06/04(Thu) 09:45:58)
コンパイラさんの言うとーり途中で例外吐かれたら値を返しませんね
finallyの後で返すようにしないと
引用返信 編集キー/
■36711 / inTopicNo.11)  Re[5]: データ件数の取得
□投稿者/ .SHO (851回)-(2009/06/04(Thu) 10:15:40)
No36692 (aetos さん) に返信

> OleDB がどうかは知りませんが、ODP.NET では decimal でした。

そうでしたか。すいません、失礼しました。
また勉強させて頂きました。ありがとうございます。

引用返信 編集キー/
■36761 / inTopicNo.12)  Re[6]: データ件数の取得
□投稿者/ EarthIsland (7回)-(2009/06/04(Thu) 23:15:42)
これで解決しました。
ありがとうございました。
//*-----------------------------------------------------------------------------
//* 名前 :gfncSQLLngGetCount
//* 記述 :カウントクエリ
//* パラメータ
//* ・strTBLName :テーブル名
//* ・strPrmID as string :カウントする列
//* ・strWhere :条件
//* 戻り値 :長整数型数値
//* 作成者 :ひろのしま
//* 変更 :2007/05/15
//*-----------------------------------------------------------------------------
public static int gfncSQLLngGetCount(string strTBLName, string strFLDName, string strwhere)
{
string strSQL="";
System.Data.DataTable objDtTBL=new System.Data.DataTable();
strSQL=strSQL + "Select ";
strSQL=strSQL + " Count(" + strFLDName + ") As CountID ";
strSQL=strSQL + "From ";
strSQL=strSQL + " " + strTBLName + " ";
strSQL=strSQL + "where ";
strSQL=strSQL + " " + strwhere + ";";
try
{
gvoidGetConnectionString();
gobjOLECnc.Open();
gobjOLECmd=new System.Data.OleDb.OleDbCommand(strSQL,gobjOLECnc);
return (int) gobjOLECmd.ExecuteScalar();
}
catch (Exception objEx)
{
System.Windows.Forms.MessageBox.Show(objEx.Source+objEx.ToString());
return 0;
}
finally
{
gobjOLECnc.Close();
}
}
No36711 (.SHO さん) に返信
> ■No36692 (aetos さん) に返信
>
>>OleDB がどうかは知りませんが、ODP.NET では decimal でした。
>
> そうでしたか。すいません、失礼しました。
> また勉強させて頂きました。ありがとうございます。
>
引用返信 編集キー/
■36774 / inTopicNo.13)  Re[7]: データ件数の取得
□投稿者/ .SHO (856回)-(2009/06/05(Fri) 10:25:00)
解決済みにしておきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -