レガシー コードは次のようにします。
public bool isValidField(string tableName, string fieldName)
{
bool retVal;
string tblQuery = string.Format("SELECT {0} FROM {1}", fieldName, tableName);
checkConnection();
try
{
SqlCeCommand cmd = objCon.CreateCommand();
cmd.CommandText = tblQuery;
object objvalid = cmd.ExecuteScalar();
retVal = (null != objvalid);
}
catch
{
retVal = false;
}
return retVal;
}
...しかし、常に機能するとは限りません。そのメソッドを呼び出して を取得した後false
、一部のコードはテーブルを変更していくつかの列を追加しますが、次のようになります。
列 ID が指定で複数回発生しました。
StackOverflow で、いくつかの有望な SQL ステートメントを見つけました。
if exists(select * from sys.columns
where Name = N'columnName' and Object_ID = Object_ID(N'tableName'))
と
IF COL_LENGTH('table_name','column_name') IS NULL
...しかし、C# / .NET 1.1 でこれを実装する方法がわかりません
ExecuteScalar を使用して、返された値を bool にキャストする必要がありますか? または、他の何か?
アップデート
これに変更しても問題は解決しませんでした:
public bool isValidField(string tableName, string columnName)
{
bool retVal;
string tblQuery = string.Format(
"COL_LENGTH({0},{1}) IS NULL",
tableName,
columnName);
checkConnection();
try
{
SqlCeCommand cmd = objCon.CreateCommand();
cmd.CommandText = tblQuery;
object objvalid = cmd.ExecuteScalar();
retVal = Convert.ToBoolean(objvalid);
}
catch
{
retVal = false;
}
return retVal;
}
更新 2
奇妙なことに、新しいコードではさらに多くのエラー メッセージが表示されます。
更新 3
このようにコードを変更しても違いはありませんでした:
string tblQuery = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS"
+ " WHERE TABLE_NAME = @tableName AND COLUMN_NAME"
+ " = @columnName";
checkConnection();
try
{
SqlCeCommand cmd = objCon.CreateCommand();
cmd.CommandText = tblQuery;
SqlCeParameter tblNameParam = new SqlCeParameter(
"@tableName",
SqlDbType.NVarChar,
128);
tblNameParam.Value = tableName;
cmd.Parameters.Add(tblNameParam);
SqlCeParameter colNameParam = new SqlCeParameter(
"@columnName",
SqlDbType.NVarChar,
128);
colNameParam.Value = tableName;
cmd.Parameters.Add(colNameParam);
int i = (int)cmd.ExecuteScalar();
retVal = i > 0;
}
...だから、どちらの方法が好ましいかわかりません。これは私にはもっと簡単に思えます...何か考えはありますか?