2014-10-06 111 views
1

你好女士们,先生们语法错误创建表C#

我有什么,我认为应该是一个简单的解决方案,但无法找到它

基本上我创建通过SQL表strugling当我运行它时,SQL存在问题。 这里是我的代码:

OleDbCommand cmd = new OleDbCommand (@"CREATE TABLE " + ClientID + " (Transaction_ID INT PRIMARY KEY NOT NULL, Transaction CHAR(255), Date DATE, Transaction_Amount INT, Balance INT, Deposited INT, Withdrew INT, Loan INT, Applied INT, Approved INT, Payment_Monthly INT, Monthly_Income INT)", mydb);

现在我测试我的SQL语句来发现哪些SQL我的一部分,给出了错误,我发现,当我删除TransactionDate它的工作领域。如果我只删除其中一个,它仍然崩溃。我甚至试图改变数据类型如CHAR(255)VARCHAR(255)DATEINT

说实话,我似乎无法找到问题。 请帮忙

谢谢你的时间。

PS:ClientID是三个数字和三个字母的组合,例如带有标签。 123#ABC

回答

6

这两列名称是SQL中的保留字。在方括号括起来将解决你的问题:

[Transaction] CHAR(255), 
[Date] DATE, 

请记住,您访问动态SQL或存储过程,这些领域的任何时间,你将不得不使用方括号为好,即

SELECT * FROM ClientTable WHERE [Transaction] = 'A' 
+0

更好的解决方案是对这些列名更具体。通过交易确定OP的意思是TransactionId或TransactionCode或类似的东西?按日期是指处理日期,处理日期,批准日期,首次输入日期?建议使用更具描述性的专栏名称。 – NotMe 2014-10-06 18:07:49

+2

我完全同意,但有时候开发人员无法控制列名,他们必须能够有办法处理这些场景。例如,我们使用一个有15年历史的应用程序,其列名与此类似,并基于源应用程序的脆弱性,我们不能尝试更改列名称,因此我们只剩下这种解决方法。显然不理想,但它是一个真实的场景。 – 2014-10-06 18:13:10

+0

没有解决的更大问题是表名:以数字开头的表名将不工作。另外,根据SQL OP的使用风格,列名的关键字'Date'可能不需要被转义(它在MS SQL 2012中不起作用)。 – Michael 2014-10-06 19:00:38