当前位置: 首页 > 面试题库 >

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

公羊英达
2023-03-14
问题内容

遗留代码以这种方式执行此操作:

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并将返回的值转换为布尔值?或者是其他东西?

更新

将其更改为此并不能解决问题:

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

…所以我不知道哪种方法更可取;对我来说,这似乎更直接了……任何想法,任何人?


问题答案:

您可以只查询信息模式表以获取所需的信息:

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


 类似资料:
  • 问题内容: 我有一个需要用户输入密码的应用程序。 我想要做的是从控制台读取密码(如果操作系统支持unix)或显示JOptionPane并要求用户输入密码(如果操作系统支持图形界面(例如Windows))。 有人可能会争辩说,在上述两种情况下控制台始终可用,因此控制台输入就足够了。但是问题是,如果Java应用程序开始使用javaw.exe,则控制台不可用。因此,我需要一种方法来确定我是否可以做任何一

  • 问题内容: 由于ResultSet包含从动态SQL返回的数据,是否有任何方法可以确定ResultSet是否包含特定的列名?例如,如果我运行但Column_ABC确实不存在,它将抛出异常。如何测试ResultSet是否可以从名为“ Column_ABC”的列中获取数据? 问题答案: 使用该类。 我不明白的是为什么会需要此功能。正在执行的查询或存储过程应具有已知结果。查询的列应该是已知的。需要这样的功

  • 问题内容: 在JMS中,很容易找出连接是否丢失,是否发生异常。但是,如何确定连接是否再次存在? 场景:我使用JMS与服务器通信。现在我的连接断开了(服务器已关闭),这导致了异常。到目前为止,一切都很好。如果服务器再次启动并重新建立连接,我怎么知道? 我看不到任何可以提供此类信息的侦听器。 问题答案: 啊…旧的异常处理/重新连接难题。 有些传输提供程序将为您自动重新连接您的应用程序,而另一些传输提供

  • 我编写了以下代码来检测目录是否存在。方法接受完全限定路径或相对路径。 注意:返回指定目录或文件名的完全限定路径。在我的例子中,这是。 这个代码已经运行了好几个月了。但它突然停止了工作。现在,当目录不存在时,中不会出现异常只返回一个空字符串。 我发布了一个类似的问题,有人建议我应该总是在路径的末尾追加。我试过了,以为我有一次例外,但现在没有例外。 我不知道与我通信的FTP服务器上的行为是否发生了变化

  • 问题内容: 我知道这与这个问题相似,但是我在C#中将SQL Server CE 3.5与WinForms项目一起使用。如何确定表是否存在?我知道虽然不支持该关键字。CE中是否存在information_schema,可以在其中查询它?谢谢。 问题答案: 是的,它确实存在:

  • 问题内容: 用Java实现此的最佳方法是什么?显然,泛型和通配符是为了能够轻松处理此类问题,但我正全神贯注。 如果有一个类似的方法来检查列表是否是相反的顺序,那也很好。 问题答案: Guava 通过其出色的Ordering类提供了此功能。An 是。在这种情况下,如果你具有实现的某种类型的列表,则可以编写: 这适用于任何,而不仅仅是,你可以通过指定s应该在其他任何非元素之前还是之后轻松地处理s :