遗留代码以这种方式执行此操作:
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,一些代码会在表中更改以添加一些列,但是我得到了:
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并将返回的值转换为布尔值?或者是其他东西?
将其更改为此并不能解决问题:
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; }
奇怪的是,我在新代码中看到了更多的错误消息。
当我以这种方式更改代码时,它没有什么不同:
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; }
…所以我不知道哪种方法更可取;对我来说,这似乎更直接了……任何想法,任何人?
您可以只查询信息模式表以获取所需的信息:
public bool isValidField(string tableName, string columnName) { var tblQuery = "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS" + " WHERE TABLE_NAME = @tableName AND" + " COLUMN_NAME = @columnName"; SqlCeCommand cmd = objCon.CreateCommand(); cmd.CommandText = tblQuery; var tblNameParam = new SqlCeParameter( "@tableName", SqlDbType.NVarChar, 128); tblNameParam.Value = tableName cmd.Parameters.Add(tblNameParam); var colNameParam = new SqlCeParameter( "@columnName", SqlDbType.NVarChar, 128); colNameParam.Value = columnName cmd.Parameters.Add(colNameParam); object objvalid = cmd.ExecuteScalar(); // will return 1 or null return objvalid != null; }