Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定SQL Server CE表中是否存在带有C#的列?_C#_Sql_Compact Framework_Sql Server Ce_Windows Ce - Fatal编程技术网

如何确定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,因此明天我必须更仔细地查看我的代码。“选择计数(*)…”也可以吗?如果是这样的话,这看起来会更简单。。。