如何确定SQL Server CE表中是否存在带有C#的列?
旧代码是这样做的:如何确定SQL Server CE表中是否存在带有C#的列?,c#,sql,compact-framework,sql-server-ce,windows-ce,C#,Sql,Compact Framework,Sql Server Ce,Windows Ce,旧代码是这样做的: public bool isValidField(string tableName, string fieldName) { bool retVal; string tblQuery = string.Format("SELECT {0} FROM {1}", fieldName, tableName); checkConnection(); try { SqlCeCommand cmd = objCon.CreateC
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;
}
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;
}
…但我发现它并不总是起作用。调用该方法并获得false
后,一些代码更改表以添加一些列,但我得到:
列ID在规范中出现多次
我在StackOverflow上发现了几个有前途的SQL语句:
if exists(select * from sys.columns
where Name = N'columnName' and Object_ID = Object_ID(N'tableName'))
及
…但我不确定如何在C#/.NET1.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;
}
更新2
奇怪的是,我在新代码中看到了更多的错误消息
更新3
当我以这种方式修改代码时,没有任何区别:
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;
}
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;
}
***SQL注入警报***这取决于如何调用isValidField()-如何获取参数的VAL,不是吗?有一个GetSchema方法可以为您提供有关表架构的任何详细信息,但是,如果我没记错的话,它可以从Framework 2开始使用。0@Steve:“该死!!!”@ClayShannon-是和否。创建
SqlParameters
以确保数据不被篡改更合适。此代码看起来比旧代码更干净,但无论出于何种原因,它都会导致应用程序在屏幕上闪烁非常短暂的对话框(应用程序本身永远不会打开)。我将isValidField()方法改回了遗留的(看起来很疯狂的代码)——这是唯一的改变——它又恢复到了正常的状态。奇怪…@ClayShannon我挂断了对checkConnection()
的调用。不确定这是否必要,我还使用了try-catch
块来简化代码,因为捕获每个异常通常是不好的做法。我的回答的主旨是提供一种查询数据库的不同方式,因此您可能需要为您的项目重新调整代码。通过两者的混合,我让它运行起来,但我仍然得到错误的MSG,因此明天我必须更仔细地查看我的代码。“选择计数(*)…”也可以吗?如果是这样的话,这看起来会更简单。。。