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

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

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

Re[5]: 戻り値の設定の仕方を教えてください。


(過去ログ 73 を表示中)

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

■42717 / inTopicNo.1)  戻り値の設定の仕方を教えてください。
  
□投稿者/ 裕猫 (27回)-(2009/10/20(Tue) 16:08:19)

分類:[C#] 

いつもお世話になってます。
データベースの中のデータの有無を確認しその結果を0,1で返したく以下のコードを書きましたが
        static int tokuisaki(string tk)
        {
            OracleConnection conn = new OracleConnection();
            conn.ConnectionString = "User ID=MATUKO;Password=matuko;Data Source=DB01";
            try
            {
                conn.Open();
                OracleCommand cmd = conn.CreateCommand();
                string sqlstr = "select * from 発注先台帳 where 発注先 = '" + tk + "'";
                cmd.CommandText = sqlstr;
                OracleDataReader dr = cmd.ExecuteReader();
                dr.Read();
                if (tk == Convert.ToString(dr[0]))
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
             }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            conn.Close();
            conn.Dispose();
        }
売上記録.Form1.tokuisaki(string)': 値を返さないコード パスがありますというエラーが出てしまいます。戻り値の設定は初めてやったのでなんか違っているのだろうと思うのですが、ぐぐってもても未だ原因がつきとめられません。よろしくお願いいたします。
開発環境
 OS:WindowsXP SP3
 言語:VisualStudio2008Pro C#
 データベース:ORACLE 10g

引用返信 編集キー/
■42718 / inTopicNo.2)  Re[1]: 戻り値の設定の仕方を教えてください。
□投稿者/ 囚人 (424回)-(2009/10/20(Tue) 16:37:53)
この関数は一番最後まで実行されたら何を返すの?
ってコンパイラに言われてます。
引用返信 編集キー/
■42719 / inTopicNo.3)  Re[1]: 戻り値の設定の仕方を教えてください。
□投稿者/ ごう (68回)-(2009/10/20(Tue) 16:40:45)
引用

>    catch (Exception ex)
>    {
>        MessageBox.Show(ex.Message);
>    }
>    conn.Close();
>    conn.Dispose();
>}

これだと、失敗時(catch以降)、何も返さないで終わっちゃいますよ。

あと、try〜文の中でreturn 0または1を記述してるとこがありますが
この位置で戻り値を返しちゃったら(関数を終了させちゃったら)
Oracleとの接続を切ったり、OracleConnectionオブジェクトを破棄したり出来ないけど
これでいいのかな?(良くないよね)

参考(try〜catch文を使ったときのサンプルもありますので、
   どんな風に戻り値を書いてるか参考にしてください)
http://ufcpp.jp/study/csharp/st_function.html



引用返信 編集キー/
■42733 / inTopicNo.4)  Re[2]: 戻り値の設定の仕方を教えてください。
□投稿者/ ヴァン (25回)-(2009/10/20(Tue) 19:48:12)
finaly{
 conn.Close();
 conn.Dispose();
}

で良いんじゃないの?
引用返信 編集キー/
■42734 / inTopicNo.5)  Re[3]: 戻り値の設定の仕方を教えてください。
□投稿者/ 魔界の仮面弁士 (1357回)-(2009/10/20(Tue) 20:02:55)
No42733 (ヴァン さん) に返信
> finaly{

 finally{

ですね。

引用返信 編集キー/
■42759 / inTopicNo.6)  Re[2]: 戻り値の設定の仕方を教えてください。
□投稿者/ 裕猫 (28回)-(2009/10/21(Wed) 08:25:57)
No42718 (囚人 さん) に返信
> この関数は一番最後まで実行されたら何を返すの?
> ってコンパイラに言われてます。
おはようございます。昨日帰り間際に入れたので今朝来てたくさんのレスに感謝しました。

あ、なるほどそういう意味のエラーですか。てっきりこのコードだと戻り値の設定ができないのかと思っていろいろ書き換えてみたんですがどうしてもエラーが止まらないので困っていたんですがエラーの意味を間違えていたんですね。納得しました。ありがとうございます。
引用返信 編集キー/
■42760 / inTopicNo.7)  Re[2]: 戻り値の設定の仕方を教えてください。
□投稿者/ 裕猫 (29回)-(2009/10/21(Wed) 08:30:32)
No42719 (ごう さん) に返信
> 引用
>
>> catch (Exception ex)
>> {
>> MessageBox.Show(ex.Message);
>> }
>> conn.Close();
>> conn.Dispose();
> >}
>
> これだと、失敗時(catch以降)、何も返さないで終わっちゃいますよ。
>
> あと、try〜文の中でreturn 0または1を記述してるとこがありますが
> この位置で戻り値を返しちゃったら(関数を終了させちゃったら)
> Oracleとの接続を切ったり、OracleConnectionオブジェクトを破棄したり出来ないけど
> これでいいのかな?(良くないよね)
>
> 参考(try〜catch文を使ったときのサンプルもありますので、
>    どんな風に戻り値を書いてるか参考にしてください)
> http://ufcpp.jp/study/csharp/st_function.html
>
>
ここも私の動作の勘違いでした。return をすると関数が終了しちゃうんですね。戻り値の設定だけでcloseも通るものと思っていました。
教えていただいたURL見てみます。ありがとうございます。
引用返信 編集キー/
■42761 / inTopicNo.8)  Re[3]: 戻り値の設定の仕方を教えてください。
□投稿者/ 裕猫 (30回)-(2009/10/21(Wed) 08:33:31)
No42733 (ヴァン さん) に返信
> finaly{
>  conn.Close();
>  conn.Dispose();
> }
>
> で良いんじゃないの?
finally 使ったことありませんでした。調べて使ってみます。ありがとうございました。
みなさんのアドバイスでだいぶ動作の誤解があったことがわかりました。参考に再度作り直してみます。ありがとうございました。
引用返信 編集キー/
■42763 / inTopicNo.9)  Re[3]: 戻り値の設定の仕方を教えてください。
□投稿者/ 裕猫 (31回)-(2009/10/21(Wed) 08:47:39)
みなさんに返信

 たくさんのアドバイスありがとうございました。参考にしてコードを
        static int tokuisaki(string tk)
        {
            int x = 0;
            OracleConnection conn = new OracleConnection();
            conn.ConnectionString = "User ID=MATUKO;Password=matuko;Data Source=DB01";
            try
            {
                conn.Open();
                OracleCommand cmd = conn.CreateCommand();
                string sqlstr = "select * from 発注先台帳 where 発注先 = '" + tk + "'";
                cmd.CommandText = sqlstr;
                OracleDataReader dr = cmd.ExecuteReader();
                dr.Read();
                if (tk == Convert.ToString(dr[0]))
                {
                    x = 1;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            finally
            {
                conn.Close();
                conn.Dispose();
            }
            return x;
        }
のように書いて思い通りの動作できました。ありがとうございました。

解決済み
引用返信 編集キー/
■42775 / inTopicNo.10)  Re[4]: 戻り値の設定の仕方を教えてください。
□投稿者/ たくボン (269回)-(2009/10/21(Wed) 10:36:33)
No42763 (裕猫 さん) に返信
> みなさんに返信
>
>  たくさんのアドバイスありがとうございました。参考にしてコードを
> try
> {
> conn.Open();
> }
> finally
> {
> conn.Close();
> conn.Dispose();
> }
> return x;
> }
> のように書いて思い通りの動作できました。ありがとうございました。

うーん、個人的にはconn.Openはtryの外だと思う。Openに対してのfinallyだと思うし、Disposeについてはnewに対しての破棄なので混同しない方がいいかも。
細かい部分を言ってるかもしれないけど、厳密に作らないと思わぬバグの温床になったりするので・・・。

・newしてからtryに入るまでの処理で例外が発生した場合、Disposeが明示的に呼ばれる?
・tryの後のOpenで、Openに失敗した場合コネクションの状態がClosedのままなのに、Closeメソッドを呼んでも大丈夫か?(oracleの場合は大丈夫なんですけどねw中には大丈夫じゃないRDBMSもいたりするから・・・)

特にコネクションの生成から実際のSQL発行までは一般的にトランザクションの開始とかごにょごにょ処理が入るから今のうちにきちんとした動作を理解した方がいいですね。
解決済み
引用返信 編集キー/
■42787 / inTopicNo.11)  Re[5]: 戻り値の設定の仕方を教えてください。
□投稿者/ 渋木宏明(ひどり) (1238回)-(2009/10/21(Wed) 13:00:50)
渋木宏明(ひどり) さんの Web サイト
どうして using 句を使わないの?
引用返信 編集キー/
■42818 / inTopicNo.12)  Re[5]: 戻り値の設定の仕方を教えてください。
□投稿者/ 裕猫 (32回)-(2009/10/21(Wed) 16:44:30)
No42775 (たくボン さん) に返信
> うーん、個人的にはconn.Openはtryの外だと思う。Openに対してのfinallyだと思うし、Disposeについてはnewに対しての破棄なので混同しない方がいいかも。
> 細かい部分を言ってるかもしれないけど、厳密に作らないと思わぬバグの温床になったりするので・・・。
>
> ・newしてからtryに入るまでの処理で例外が発生した場合、Disposeが明示的に呼ばれる?
> ・tryの後のOpenで、Openに失敗した場合コネクションの状態がClosedのままなのに、Closeメソッドを呼んでも大丈夫か?(oracleの場合は大丈夫なんですけどねw中には大丈夫じゃないRDBMSもいたりするから・・・)
>
> 特にコネクションの生成から実際のSQL発行までは一般的にトランザクションの開始とかごにょごにょ処理が入るから今のうちにきちんとした動作を理解した方がいいですね。

ありがとうございます。また一つ勉強になりました。実はclose とDisposeの使い方の区別がついていませんでした。サンプルを元に作っているのでまだ理解が浅いです。教わったことノートに記録してしっかり理解します。
引用返信 編集キー/
■42819 / inTopicNo.13)  Re[6]: 戻り値の設定の仕方を教えてください。
□投稿者/ 裕猫 (33回)-(2009/10/21(Wed) 16:46:22)
No42787 (渋木宏明(ひどり) さん) に返信
> どうして using 句を使わないの?
すみません。 using句の使い方知りませんでした。調べたところなかなか使えるものですね。早速使います。ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -