2010-12-19 72 views
3

下面我提供了我的数据库模式,当前插入的数据库数据(只有一条记录)和我正在运行的代码。这是一个非常简单的设置,但不返回数据库中的一条记录,它不返回任何内容。任何人有任何想法为什么?我在这里我束手无策......极其简单的SQLite查询不会返回预期的

表:分包商

列:在(名称类型)格式如下。

ID guid, 
BusinessName varchar(50), 
Address varchar(200), 
City varchar(50), 
State varchar(50), 
ZipCode varchar(50), 
Contact varchar(50), 
Phone varchar(50), 
Fax varchar(50), 
Email varchar(200), 
GLOPolicy bit, 
GLOLimit bigint, 
GLOExpiration datetime, 
ALPolicy bit, 
ALLimit bigint, 
ALExpiration datetime, 
WCPolicy bit, 
WCLimit bigint, 
WCExpiration datetime, 
ULPolicy bit, 
ULLimit bigint, 
ULExpiration datetime, 
Notes varchar(15000) 

=====

我在我的数据库中的一个记录,如下所示。

ID "7b143c19-ad66-46ad-b587-db0bee98cf1e" 
BusinessName "1" 
Address "1" 
City "1" 
State "1" 
ZipCode "1" 
Contact NULL 
Phone NULL 
Fax NULL 
Email NULL 
GLOPolicy False (0) 
GLOLimit NULL 
GLOExpiration NULL 
ALPolicy False (0) 
ALLimit NULL 
ALExpiration NULL 
WCPolicy False (0) 
WCLimit NULL 
WCExpiration NULL 
ULPolicy False (0) 
ULLimit NULL 
ULExpiration NULL 
Notes NULL 

===== * 我试图下面的查询,并没有返回,当它显然应该返回的唯一记录,如上图所示。 *

String ID = "7b143c19-ad66-46ad-b587-db0bee98cf1e"; 
DataTable dt = sqliteQuery.selectFromDatabase("*", "WHERE ID = '" + ID + "'"); 

而对于上述方法的代码是...

public DataTable selectFromDatabase(String column, String filter) 
    { 
     string SQL = "SELECT " + column + " FROM SUBCONTRACTOR " + filter; 
     SQLiteCommand cmd = new SQLiteCommand(SQL); 
     cmd.Connection = connection; 
     SQLiteDataAdapter da = new SQLiteDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     try 
     { 
      da.Fill(ds); 
      DataTable dt = ds.Tables[0]; 
      return dt; 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
      return null; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      connection.Close(); 
     } 
    } 
+0

首先尝试选择没有过滤。将谓词设置为WHERE 1 = 1(总是为true)而不是筛选器,以确保获得所有行。如果你不这样做,那不是错误的查询。此外,您的列类型是一个GUID,但您的查询使用字符串值。您可能需要转换。 – 2010-12-19 06:33:38

+0

将筛选器设置为1 = 1时,它将返回数据库中的单个记录,因为它应该如此。假设有什么类型的转换?我在做假设时,所有事情都是以字符串的形式传递的......是不是这种情况?如果不是,你知道这样的转换吗? – CODe 2010-12-19 06:35:12

回答

4

它看起来像SQLite不支持GUID类型本身。它受到包装和插件的支持,但我认为您在使用类型的方式之间遇到阻抗。您最好将其更改为TEXT类型。然后你的谓词将起作用。

编辑

要创建一个新的GUID值插入行作为一个p键只是做:

Guid.NewGuid().ToString(); 

另外,我发现the following info

GUID不(!)本地 SQLite数据类型,但由罗伯特的包装提供 插件。在连接 字符串中,您可以指定 “BinaryGUID = Yes | No”,其中默认为 。当“BinaryGUID = Yes”时,存储器采用16字节的 存储器来存储 GUID。现在取决于 “SQLite专家”是否识别出 数据类型GUID。如果是这样,你应该看它 在它的文件是如何处理 。如果不是,则可能将 视为文本(可能与无效的 字符数据)。当您更改 SQLite编辑器或包装时,您将再次遇到此问题 。

当“BinaryGUID =否”的GUID是 存储为文本以32-38字节(我 不知道减号标志和 括号{}是否存储,你必须 测试)。当存储不是一个大的问题时,我会建议使用这个 表格。你应该没有问题 用什么包装或DB编辑器 你使用并节省了大量的时间和 麻烦。

这种类型本身似乎有问题。

+0

所以,包装转换为十六进制? Blah,有没有一种方法可以轻松地做到我在上面做的事情的方式,实际上会工作? -_- – CODe 2010-12-19 06:44:11

+1

是的。将您的ID列类型更改为文本。 (我的答案是我的主要观点。) – 2010-12-19 06:46:11

+0

我对文本数据类型不熟悉,它是否为像guid这样的每个记录提供了唯一值?或者我必须以某种方式手动执行此操作? – CODe 2010-12-19 06:48:02