简体   繁体   English

如何使用C#确定SQL Server CE表中是否存在列?

[英]How can I determine whether a column exists in a SQL Server CE table with C#?

The legacy code does it this way: 遗留代码以这种方式执行:

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;
}

...but I find it doesn't always work. ...但我发现它并不总是有效。 After calling that method, and getting false , some code ALTERS the table to add some columns, but I'm getting: 在调用该方法并获得false ,一些代码会在表中添加一些列,但是我得到了:

A column ID occurred more than once in the specification. 列ID在规范中出现多次。

I found here on StackOverflow a couple of promising SQL statements: 我在StackOverflow上找到了几个有前途的SQL语句:

if exists(select * from sys.columns 
        where Name = N'columnName' and Object_ID = Object_ID(N'tableName'))  

and

IF COL_LENGTH('table_name','column_name') IS NULL

...but am not sure how to implement this in C# / .NET 1.1 ...但我不确定如何在C#/ .NET 1.1中实现它

Do I need to use ExecuteScalar and cast the returned value to a bool? 我是否需要使用ExecuteScalar并将返回的值转换为bool? Or something else? 或者是其他东西?

UPDATE UPDATE

Changing it to this didn't rectify matters: 改变它并没有纠正问题:

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;
}

UPDATE 2 更新2

Oddly enough, I see even more of those error messages with the new code. 奇怪的是,我用新代码看到了更多这些错误消息。

UPDATE 3 更新3

It made no difference when I altered the code this way: 当我以这种方式更改代码时没有任何区别:

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;
}

...so I don't know which way is preferable; ......所以我不知道哪种方式更可取; this does seem more straightforward to me...any thoughts, anyone? 这对我来说似乎更直接......任何想法,任何人?

You can just query the information schema tables to get the information you want: 您只需查询信息架构表即可获得所需信息:

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;
}
    public bool IsValidField(SqlCeConnection objCon, string tableName, string columnName)
    {
        const string query = "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS"
                                + " WHERE TABLE_NAME = @TABLENAME AND"
                                + " COLUMN_NAME = @COLUMNNAME";

        using (var cmd = new SqlCeCommand(query, objCon))
        {
            cmd.Parameters.Add("@TABLENAME", SqlDbType.NVarChar, 128).Value = tableName;
            cmd.Parameters.Add("@COLUMNNAME", SqlDbType.NVarChar, 128).Value = columnName;
            var objvalid = cmd.ExecuteScalar(); // will return 1 or null
            return objvalid != null;
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何检查 SQL Server CE 3.5 中是否存在表 - How can I check whether a table exists in SQL Server CE 3.5 如何以编程方式确定SQL Server CE数据库中是否存在表? - How can I programmatically determine if a table exists within a SQL Server CE database? 如何在 C# 中确定 SQL Server 数据库列是否为自动增量? - How can I determine in C# whether a SQL Server database column is autoincrement? 确定SQL Server CE中是否存在表? - Determine if table exists in SQL Server CE? 如何在C#中检查数据库中是否存在表(ACCESS或SQL) - how can i check whether a table exists in the database (ACCESS or SQL) in C# 如何确定是否存在SQL Server或数据库 - How to determine whether a SQL server or database exists 如何使用SQL Server CE和C#更新dB表中的单元格值(Visual Studio 2010) - How can I update a cell value in a dB table, using SQL Server CE and C# (Visual Studio 2010) 如何使用C#在Windows CE中将SQL Server Compact表导出到Excel? - How do I export an SQL Server Compact table to an Excel in Windows CE with C#? 如何在C#应用程序的嵌入式SQL Server CE数据库中存储长文本数据? - How can I store long text data in embedded SQL Server CE database of C# application? SQL Server和C#-如何检查我要上传的varbinary(max)文件是否已存在于表中? - SQL Server & C# - How can I check if a varbinary(max) file i'm uploading already exists in a table?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM