none
C#関数 RRS feed

  • 質問

  • 環境:
    windows XP(SP3)
    Visual Studio 2008(SP1)
    C#とADO.net を学習したいので、あるVB.net のサンプルをC#に変更

    行いたいこと:
    関数の戻り値を取得したい


    public struct structEmployee
    {
        public string employeecode;
        public string employeename;
        public string employeejapanese;
        public string postcode;
        public string updatetime;
    
    }
    
    
    protected void Page_Load(object sender, EventArgs e)
    {
        structEmployee[] syainInfo = null;
        string msg = null;
        int i = 0;
        string strOut = null;
    
    	//
    	//ここで戻り値を取得したい
        //
        msg = getSyainAll(syainInfo);
    
        if (string.IsNullOrEmpty(msg))
        {
            //取得レコードの確認
            for (i = 0; i <= syainInfo.Length - 1; i++)
            {
                strOut = (i + 1).ToString() + "件目==>";
                strOut += " 社員コード:" + syainInfo[i].employeecode;
                strOut += ", 社員氏名:" + syainInfo[i].employeename;
                strOut += ", 社員カナ:" + syainInfo[i].employeejapanese;
                strOut += ", 部門コード:" + syainInfo[i].postcode;
                strOut += ", 更新日時:" + syainInfo[i].updatetime;
                //レコードの内容をコンソールに出力
                //Trace.WriteLine(strOut);
                TextBox1.Text = msg;
            }
        }
        else
        {
            //レコードが取得できなかった時の処理
            
        }
    
    }
    
    
    
    private string getSyainAll(ref structEmployee[] syainInfo)
    {
    
        SqlConnection oConn = new SqlConnection();
        SqlCommand oCommand = new SqlCommand();
        SqlDataReader oDataReader = default(SqlDataReader);
        
        int i = 0;
    
        try
        {
            oConn.ConnectionString = "";
    
            oCommand.Connection = oConn;
    
            oCommand.CommandText = "SELECT * FROM 社員テーブル";
    
            oConn.Open();
    
            oDataReader = oCommand.ExecuteReader();
    
            i = -1;
    
            while (oDataReader.Read())
            {
                i = i + 1;
    
                Array.Resize(ref syainInfo, i + 1);
    	        syainInfo[i].employeecode = oDataReader["社員コード"].ToString();
                syainInfo[i].employeename = oDataReader["社員氏名"].ToString();
    
                if (oDataReader["社員カナ"] == System.DBNull.Value)
                {
                    syainInfo[i].employeejapanese = "";
                }
                else
                {
                    syainInfo[i].employeejapanese = oDataReader["社員カナ"].ToString();
                }
    
                syainInfo[i].postcode = oDataReader["部門コード"].ToString();
                syainInfo[i].updatetime = oDataReader["更新日時"].ToString();
            }
    
            if (syainInfo == null)
            {
                return "社員テーブルにレコードがありません";
            }
            else
            {
                return "";
    
            }
        }
        catch (Exception oExcept)
        {
            return oExcept.ToString();
        }
        finally
        {
            if ((oDataReader != null))
            {
                oDataReader.Close();
            }
    
            if ((oConn != null))
            {
                oConn.Close();
    
            }
    
        }
    }


    コードの中の msg = getSyainAll(syainInfo); で、関数getSyainAllの戻り値を取得したいのですが、
    以下のエラーで怒られてしまいます。

    エラー 1 'GetAllRecords.getSyainAll(ref GetAllRecords.structEmployee[])'
    に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。

    エラー 2 引数 '1' は 'ref' キーワードと共に渡されなければなりません。


    初歩的で申し訳ございませんが、戻り値を取得する方法を教えてください。




    tomotomody
    2009年12月23日 13:31

回答

  • msg = getSyainAll(ref syainInfo);
    でいかがでしょうか
    • 回答としてマーク キングス 2009年12月26日 7:58
    2009年12月23日 14:04
  • 答えはMyonさんの書かれている通りです。
    それよりも貼り付けられているソースが気になりました。VB.NETの書き写しだからでしょうが、ちょっとう~んとおもってしまう記述ばかりです。(たぶん元のVBのコードにも問題があるのだとは思いますが。)
    あと書き写しの際に紛れ込んだバグもあります。
    可能なら最初からC#向きに書かれた情報を参照することをお勧めします。

    # というわけでなんとなく書いてみました。適切な型を使うべきという例の意味でPostCodeをintにUpdateTimeをDateTimeに変更しています。
        class Employee {
            public string Code { get; set; }
            public string Name { get; set; }
            public string Japanese { get; set; }
            public int PostCode { get; set; }
            public DateTime UpdateTime { get; set; }
        }

        protected void Page_Load( object sender, EventArgs e ) {
            try {
                var shain = getSyainAll();
                var text = new StringBuilder();
                var i = 1;
                foreach( var s in shain )
                    text.AppendFormat( "{0}件目==> 社員コード:{1}, 社員氏名:{2}, 社員カナ:{3}, 部門コード:{4}, 更新日時:{5}",
                        i++,            // 0
                        s.Code,            // 1
                        s.Name,            // 2
                        s.Japanese,        // 3
                        s.PostCode,        // 4
                        s.UpdateTime    // 5
                        );
                TextBox1.Text = text.ToString();
            }
            catch( Exception e ) {
                //レコードが取得できなかった時の処理
            }
        }

        private Employee[] getSyainAll() {
            using( var connection = new SqlConnection( "ConnectionStringがここに入る" ) ) {
                connection.Open();
                using( var command = connection.CreateCommand() ) {
                    command.CommandText = "SELECT 社員コード, 社員氏名, 社員カナ, 部門コード, 更新日時 FROM 社員テーブル";
                    using( var reader = command.ExecuteReader() ) {
                        if( !reader.HasRows )
                            // もっと適切な例外を使用すること
                            throw new Exception( "社員テーブルにレコードがありません" );

                        var syain = new List<Employee>();
                        while( reader.Read() )
                            syain.Add( new Employee {
                                Code = reader.GetString( 0 ),
                                Name = reader.GetString( 1 ),
                                Japanese = reader.GetString( 2 ) ?? "",
                                PostCode = reader.GetInt32( 3 ),
                                UpdateTime = reader.GetDateTime( 4 )
                            } );
                        return syain.ToArray();
                    }
                }
            }
        }

    • 回答としてマーク キングス 2009年12月26日 7:58
    2009年12月23日 15:19

すべての返信

  • msg = getSyainAll(ref syainInfo);
    でいかがでしょうか
    • 回答としてマーク キングス 2009年12月26日 7:58
    2009年12月23日 14:04
  • 答えはMyonさんの書かれている通りです。
    それよりも貼り付けられているソースが気になりました。VB.NETの書き写しだからでしょうが、ちょっとう~んとおもってしまう記述ばかりです。(たぶん元のVBのコードにも問題があるのだとは思いますが。)
    あと書き写しの際に紛れ込んだバグもあります。
    可能なら最初からC#向きに書かれた情報を参照することをお勧めします。

    # というわけでなんとなく書いてみました。適切な型を使うべきという例の意味でPostCodeをintにUpdateTimeをDateTimeに変更しています。
        class Employee {
            public string Code { get; set; }
            public string Name { get; set; }
            public string Japanese { get; set; }
            public int PostCode { get; set; }
            public DateTime UpdateTime { get; set; }
        }

        protected void Page_Load( object sender, EventArgs e ) {
            try {
                var shain = getSyainAll();
                var text = new StringBuilder();
                var i = 1;
                foreach( var s in shain )
                    text.AppendFormat( "{0}件目==> 社員コード:{1}, 社員氏名:{2}, 社員カナ:{3}, 部門コード:{4}, 更新日時:{5}",
                        i++,            // 0
                        s.Code,            // 1
                        s.Name,            // 2
                        s.Japanese,        // 3
                        s.PostCode,        // 4
                        s.UpdateTime    // 5
                        );
                TextBox1.Text = text.ToString();
            }
            catch( Exception e ) {
                //レコードが取得できなかった時の処理
            }
        }

        private Employee[] getSyainAll() {
            using( var connection = new SqlConnection( "ConnectionStringがここに入る" ) ) {
                connection.Open();
                using( var command = connection.CreateCommand() ) {
                    command.CommandText = "SELECT 社員コード, 社員氏名, 社員カナ, 部門コード, 更新日時 FROM 社員テーブル";
                    using( var reader = command.ExecuteReader() ) {
                        if( !reader.HasRows )
                            // もっと適切な例外を使用すること
                            throw new Exception( "社員テーブルにレコードがありません" );

                        var syain = new List<Employee>();
                        while( reader.Read() )
                            syain.Add( new Employee {
                                Code = reader.GetString( 0 ),
                                Name = reader.GetString( 1 ),
                                Japanese = reader.GetString( 2 ) ?? "",
                                PostCode = reader.GetInt32( 3 ),
                                UpdateTime = reader.GetDateTime( 4 )
                            } );
                        return syain.ToArray();
                    }
                }
            }
        }

    • 回答としてマーク キングス 2009年12月26日 7:58
    2009年12月23日 15:19
  • Myonさん佐祐理さんコメントありがとうございます。
    ひとまず無事解決しました。

    ありがとうございます。
    自作関数や自作関数を利用したプログラムは慣れていないので学習します。


    tomotomody
    2009年12月26日 8:00