无数据返回 如果选择查询的搜索条件仅包含数字并且查询表的 nVarChar 列

Posted

技术标签:

【中文标题】无数据返回 如果选择查询的搜索条件仅包含数字并且查询表的 nVarChar 列【英文标题】:No data return If search condition of a select query contains only numerals and query on a nVarChar column of a table 【发布时间】:2013-04-17 18:50:54 【问题描述】:

我有一个 windows 应用程序来同步存储在 SQL Server CE 数据库中的 windows mobile 应用程序的数据。我在连接到 windows 7 32 位 PC 的移动设备同步时遇​​到了一些问题。

在同步时,Windows 应用程序会将 SQL Server CE 数据库从移动设备复制到 PC,并与本地复制的数据库同步数据,然后再复制回移动设备。如果完成同步的 PC 是 windows 7 32Bit,那么在使用同步数据库时,我会在 Windows Mobile 应用程序中遇到以下问题。

如果有一个包含nVarChar 列的表并对该列进行搜索查询,如果搜索条件包含带有单引号的数字以将值表示为字符串,则不会返回任何数据(在以下示例中,strProductID 是@987654324 @专栏)

例如:-

SELECT * FROM Products WHERE strProductID = '2345' 

但是不带引号的数字或带引号的字母都可以正常工作

例如:-

SELECT * FROM Products WHERE strProductID = 2345 

SELECT * FROM Products WHERE strProductID = 'asdasd'

【问题讨论】:

(1) 为什么要使用 NVARCHAR 列来存储数字? (2) 您是否尝试过正确地为您的 Unicode 字符串文字添加前缀,例如WHERE strProductID = N'2345'? (3) 你为什么使用愚蠢的数据类型前缀? 使用具有正确数据类型的参数化查询。我不知道为什么你有时会有单引号,有时不会。使用与列匹配的数据类型创建参数化查询,不要再为这些不必要的(和导致问题的)细节而烦恼。 我没有在该列中存储数字,但该字段包含可以包含数字和字母组合的字符串代码。如果移动界面提供了搜索代码的便利,用户可以只使用部分代码进行搜索,那么搜索字段中的值类型可以只是数字。因此查询将是 SELECT * FROM Products WHERE strProductID LIKE 'asdasd%' 如果 SQL CE 数据库同步在 windows7 32 位机器中完成但同步 SQL CE 数据库在 XP 和 Windows7 64 位 PC 将适用于移动应用程序,即使这也不起作用. 你看到我关于使用N'asdasd' 而不是'asdasd' 的评论了吗?您可以在SQLfiddle.com 上重现您的问题吗? 我不使用一些带单引号的查询和一些不带引号的查询我在每个查询中都使用引号,因为该字段是 NVarchar 列,但我在这里解释了如果搜索条件仅包含数字,它将不起作用带引号,我尝试不带引号只是为了检查它是否有效,如果搜索条件包含字母字符串,即使使用引号查询也有效。 【参考方案1】:

正如 Aaron Bertrand 在评论中所说,如果您使用参数,您的查询会更好地工作。

strProductID NVARCHAR 字段有多大? 50?我将假设为 50,以便编写您的参数化查询:

private DataTable Get(string strProductID, string connStr) 
  var table = new DataTable();
  string cmdText = "SELECT * FROM Products WHERE strProductID=@strProductID";
  using (var cmd = new SqlCeCommand(cmdText, new SqlCeConnection(connStr))) 
    cmd.Parameters.Add("@strProductID", SqlDbType.NVarChar, 50).Value = strProductID;
    cmd.Connection.Open();
    table.Load(cmd.ExecuteReader());
    cmd.Connection.Close();
  
  return table;

但是,Microsoft 承认断开连接的数据集在 Windows Mobile 设备中不是很可靠!请参阅Walkthrough: Creating an Occasionally Connected Smart Device Application 中的 cmets。

【讨论】:

以上是关于无数据返回 如果选择查询的搜索条件仅包含数字并且查询表的 nVarChar 列的主要内容,如果未能解决你的问题,请参考以下文章

根据雪花中的条件选择列

Django的ORM基础增删改查

搜索引擎学习初识Lucene

全文搜索,包含多个确切的短语和排除项

MySql数据库增删改查常用语句命令

如果仅句子包含搜索列表中的任何关键字,则从数据框文本列中选择句子