【问题标题】:SqlException was unhandled by user code, incorrect syntax near '3'SqlException 未被用户代码处理,'3' 附近的语法不正确
【发布时间】:2016-06-10 09:15:05
【问题描述】:

Error image

大家好,

我有这个错误,用户代码未处理 sqlException,3 附近的语法不正确。

下面是我的代码。

private void get3GSiteID()
    {
        string name3G = "";

        DataTable dtSite = new DataTable();            

        sqlStr = " SELECT ";
        sqlStr += " SNumb ";
        sqlStr += " FROM ";
        sqlStr += " 3G.DBO.W_Site AS W_SITE";
        sqlStr += " WHERE ";
        sqlStr += " W_SITE.Address = '" + siteAddress + "'";            
        SqlDataAdapter daSite = new SqlDataAdapter(sqlStr, tGConnection3G);
        dtSite.Clear();
        daSite.Fill(dtSite);
        if (dtSite.Rows.Count > 0)
        {
            name3G = dtSite.Rows[0]["SNumb"].ToString();
            siteIDCheckBox.Add(name3G);
            bssNetworkList.Add("3G");
        }
    }

请帮忙。 我已经被困在这里两天了..

谢谢

【问题讨论】:

  • 为了找出问题所在,您需要通过指定异常发生时使用的值来提供帮助(SNumbsiteAddress)。这至少可以让我们看到导致异常的 SQL 命令是什么......
  • ok SNumb 是 site003,siteAddress 是 blk 123 good road
  • 那么导致异常的SQL语句是SELECT site003 from 3G.DBO.W_Site AS W_SITE WHERE W_SITE.Address = 'blk 123 good road'?你用的是哪个RDBMS
  • 我不确定。该数据库是由另一个人创建的。
  • 是的,那样做不好:)

标签: sqlexception


【解决方案1】:

感谢@Dave,我设法解决了答案,它不是 [3G.DBO.W_Site] 而是 [3G].DBO.W_Site

private void get3GSiteID()
{
    string name3G = "";

    DataTable dtSite = new DataTable();            

    sqlStr = " SELECT ";
    sqlStr += " SNumb ";
    sqlStr += " FROM ";
    sqlStr += " **[3G]**.DBO.W_Site AS W_SITE";
    sqlStr += " WHERE ";
    sqlStr += " W_SITE.Address = '" + siteAddress + "'";            
    SqlDataAdapter daSite = new SqlDataAdapter(sqlStr, tGConnection3G);
    dtSite.Clear();
    daSite.Fill(dtSite);
    if (dtSite.Rows.Count > 0)
    {
        name3G = dtSite.Rows[0]["SNumb"].ToString();
        siteIDCheckBox.Add(name3G);
        bssNetworkList.Add("3G");
    }
}

【讨论】:

    【解决方案2】:

    试试这个;在 SQL Server 中 rules for database identifiers state 那个

    第一个字符必须是以下之一: 定义的字母 通过 Unicode 标准 3.2。字母的Unicode定义 包括从 a 到 z、从 A 到 Z 的拉丁字符,以及 其他语言的字母字符。

    下划线 (_),at 符号 (@) 或数字符号 (#)。

    开头的某些符号 标识符在 SQL Server 中具有特殊含义。常规标识符 以 at 符号开头的总是表示局部变量或 参数并且不能用作任何其他类型对象的名称。 以数字符号开头的标识符表示临时表 或程序。以双数字符号 (##) 开头的标识符 表示全局临时对象。虽然数字符号或双 数字符号字符可用于开始其他类型的名称 对象,我们不推荐这种做法。一些 Transact-SQL 函数的名称以双 at 符号 (@@) 开头。避免 与这些功能混淆,您不应该使用开头的名称 与@@。

    由于您正在尝试查询数据库,因此它可能已经存在,这意味着您需要使用双引号或方括号来分隔名称。

    private void get3GSiteID()
        {
            string name3G = "";
    
            DataTable dtSite = new DataTable();            
    
            sqlStr = " SELECT ";
            sqlStr += " SNumb ";
            sqlStr += " FROM ";
            sqlStr += " [3G.DBO.W_Site] AS W_SITE";
            sqlStr += " WHERE ";
            sqlStr += " W_SITE.Address = '" + siteAddress + "'";            
            SqlDataAdapter daSite = new SqlDataAdapter(sqlStr, tGConnection3G);
            dtSite.Clear();
            daSite.Fill(dtSite);
            if (dtSite.Rows.Count > 0)
            {
                name3G = dtSite.Rows[0]["SNumb"].ToString();
                siteIDCheckBox.Add(name3G);
                bssNetworkList.Add("3G");
            }
        }
    

    【讨论】:

    • 噢噢噢噢。非常感谢你的回答。但我想我试过了。但它有另一个例外,即无效对象 [3G.DBO.W_Site]。不确定我是否在任何地方犯了任何错误。有趣的是,相同的代码适用于所有其他数据库,它不是以你所说的原因开头的数字。
    • 我现在无法访问系统。我想我会在星期一再次尝试你的答案。
    • 嗨,对不起,我刚刚尝试过,现在我收到了一个新错误,提示对象名称无效。
    • 您找到您使用的数据库系统了吗?这会有所帮助
    猜你喜欢
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多