トップ回答者
C#関数

質問
-
環境:
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
回答
-
答えは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
すべての返信
-
答えは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