【问题标题】:Incorrect syntax near the keyword "INTO"关键字“INTO”附近的语法不正确
【发布时间】:2015-08-13 09:50:26
【问题描述】:

这是导致错误的insert 查询:

 public int Insert(User obj){

     string query = "INSERT IGNORE INTO tblUser(Name,Photo,Email,Password,Branch,Phone,Address,Authority,Recover_Email,Facebook_ID)  values(@name,@photo,@email,@pass,@branch,@phone,@addr,@auth,@re,@fbID) ";
     List<SqlParameter> lstp = new List<SqlParameter>();
     lstp.Add(new SqlParameter("@name", obj.Name));
     lstp.Add(new SqlParameter("@photo", obj.Photo));
     lstp.Add(new SqlParameter("@email", obj.Email));
     lstp.Add(new SqlParameter("@pass", obj.Password));
     lstp.Add(new SqlParameter("@branch", obj.Branch));
     lstp.Add(new SqlParameter("@phone", obj.Phone));
     lstp.Add(new SqlParameter("@addr", obj.Address));
     lstp.Add(new SqlParameter("@auth", obj.Authority));
     lstp.Add(new SqlParameter("@re", obj.Recovery_Email));
     lstp.Add(new SqlParameter("@fbID", obj.Facebook_ID));
     return DBUtility.ModifyData(query, lstp);
}

异常详情:

System.Data.SqlClient.SqlException:关键字附近的语法不正确 '进入'

表定义:

CREATE TABLE [dbo].[tblUser] (
    [UserID]         INT           IDENTITY (1, 1) NOT NULL,
    [Name]           VARCHAR (100) NULL,
    [Photo]          VARCHAR (500) NULL,
    [Email]          VARCHAR (50)  NULL,
    [Password]       VARCHAR (500) NULL,
    [Branch]         VARCHAR (50)  NULL,
    [Phone]          VARCHAR (50)  NULL,
    [Address]        VARCHAR (500) NULL,
    [Recovery_Email] VARCHAR (100) NULL,
    [Facebook_ID]    VARCHAR (200) NULL,
    PRIMARY KEY CLUSTERED ([UserID] ASC)
);

如果需要,堆栈跟踪:

 [SqlException (0x80131904): Incorrect syntax near the keyword 'INTO'.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1787814
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5341674
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +546
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1693
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +275
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) +1421
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +177
   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) +208
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +163
   DataAccess.DBUtility.ModifyData(String query, List`1 lstParams) in c:\Users\ABHISHEK\Documents\Visual Studio 2013\Projects\InventoryManagement\DataAccess\DBUtility.cs:36
   BusinessLogic.UserLogic.Insert(User obj) in c:\Users\ABHISHEK\Documents\Visual Studio 2013\Projects\InventoryManagement\BusinessLogic\UserLogic.cs:30
   InventoryManagementSys.FacebookSync.AuthorizeUser() in c:\Users\ABHISHEK\Documents\Visual Studio 2013\Projects\InventoryManagement\InventoryManagementSys\FacebookSync.aspx.cs:83
   InventoryManagementSys.FacebookSync.Page_Load(Object sender, EventArgs e) in c:\Users\ABHISHEK\Documents\Visual Studio 2013\Projects\InventoryManagement\InventoryManagementSys\FacebookSync.aspx.cs:20
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
   System.Web.UI.Control.OnLoad(EventArgs e) +92
   System.Web.UI.Control.LoadRecursive() +54
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772

【问题讨论】:

  • 你为什么在这里使用ignore
  • INSERT IGNOREmysql 语法。
  • @nadeem : 我不想让重复的条目进入我的表格
  • 删除 Sql-Server 标签:这是 MySQL 特定的。
  • @Ullas :我在我的其他 asp.net webapp 中使用了类似的查询,它在那里工作得非常好

标签: sql asp.net sql-server sql-insert


【解决方案1】:

AFAIK,您不能将INSERT IGNORE 用于SQL SERVER。如果您在SQL SERVER 2008 onwards 上,您可以使用MERGE 执行INSERT(如果行不存在)或UPDATE。例如

MERGE
INTO    tmp_final dv
USING   tmp_holding_DataValue t
ON      t.dateStamp = dv.dateStamp
        AND t.itemId = dv.itemId
WHEN NOT MATCHED THEN
INSERT  (dateStamp, itemId, value)
VALUES  (dateStamp, itemId, value)

编辑:很明显,您正在针对 SQL Server 执行,因为 SQL Server 客户端特定类型和方法出现在您的堆栈跟踪中。

【讨论】:

  • 我对我的其他 asp.net 项目使用了类似的查询,它工作得非常好
  • 这似乎是一个 MySql 特定的问题:因此我删除了 SQL Server 标签(我怀疑提问者认为 Sql-Server 是一个通用标签)。
  • @Richard 我实际上怀疑他们正在尝试使用他们在 SQL Server 中的 mySql 中看到的代码 - 所以,SQL Server 标记可能是正确的。
  • @AdrianWragg 你可能是对的:查看堆栈跟踪。
【解决方案2】:

基于cmets的问答:

您将Microsoft's SQL Server RDBMS 与Oracle's MySQL RDBMS 混在一起。

使用 SQL Server 时需要使用 T-SQL(微软的 SQL 方言)。

使用 MySQL 时需要使用 MySQL 的 SQL 方言。

虽然可以编写同时使用两者的通用代码,但它要复杂得多(例如,对于大多数代码,您需要使用通用类型(如DbCommand)来生成具有某种形式的工厂层的正确具体类型)。

要么始终如一地使用一个 RDBMS(更简单的选择),要么构建基础架构(包括将自己限制在 SQL 方言的公共部分)以跨 RDBMS 工作。

【讨论】:

  • 就在我在 Visual Studio IDE 中编写测试查询时。它是用 T-SQL 编写的。但我的问题仍然没有得到解答。为什么错误仍然存​​在!\
  • @AbhishekGhosh 因为INSERT IGNORE INTO… 不是有效的 T-SQL。 IGNORE 选项是 MySql 特定的扩展。
  • 但是我在 Visual Studio (2010) IDE 中的之前的 ASP .NET 项目中使用过这个......但是现在我使用的是 Vs2013,并且出现了这个错误!是因为版本吗?
  • 您之前的项目显然使用的是 MySQL 而不是 SQL Server。
  • 好的,那么我应该如何编写这个查询,其中相同的记录对 VS2013 IDE 不感兴趣?
猜你喜欢
  • 2016-06-08
  • 2013-12-16
  • 2017-11-22
  • 2018-06-16
  • 2013-10-29
  • 2014-06-22
  • 1970-01-01
  • 2013-05-04
  • 2013-05-21
相关资源
最近更新 更多