【问题标题】:There is already an object in the database Exception数据库中已经有一个对象异常
【发布时间】:2014-11-21 11:41:01
【问题描述】:

我的代码出了什么问题...我尝试了几件事,但一次又一次地遇到同样的错误。

有什么帮助吗?? 代码是:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[SubDomainName].ToString());
conn.Open();
string temptable = "CREATE TABLE [dbo].[Tmptablenew]([TicketID] [int] NULL,[TicketDescription][varchar](max) NULL,[TicketAssignedTo] [varchar](100) NULL,[TicketCreatedDate] [datetime] NULL,[TicketStatus][varchar](50),CRMConnectionID [int] NULL,[TicketUpdatedDate] [Datetime] NULL,img [varchar](500) NULL)";
SqlCommand cmd = new SqlCommand(temptable, conn);
cmd.ExecuteNonQuery();
SqlCommand cmmd = new SqlCommand("select * from Tickets", conn);
SqlDataAdapter adapter = new SqlDataAdapter(cmmd);
DataTable dt1 = new DataTable("dt1");
adapter.Fill(dt1);
cmmd.ExecuteNonQuery();

//BulkCopy the data in the DataTable to the temp table
using (SqlBulkCopy bulk = new SqlBulkCopy(conn))
{
    bulk.DestinationTableName = "Tmptablenew";
    bulk.WriteToServer(result);
    conn.Close();
}
conn.Open();
string mergeSql = "merge into Tickets as Target " +
                     "using Tmptablenew as Source " +
                     "on " +
                     "Target.TicketID= Source.TicketID " +
                     "and Target.CRMConnectionID = Source.CRMConnectionID " +
                     "when not matched then " +
                     "insert (TicketID,TicketDescription,TicketAssignedTo,TicketCreatedDate,TicketStatus,CRMConnectionID,TicketUpdatedDate,img) values (Source.TicketID,Source.TicketDescription,Source.TicketAssignedTo,Source.TicketCreatedDate,Source.TicketStatus,Source.CRMConnectionID,Source.TicketUpdatedDate,Source.img);";

string mergesql1 = "Update Tickets SET TicketDescription=S.TicketDescription, TicketAssignedTo = S.TicketAssignedTo, TicketStatus = S.TicketStatus,TicketUpdatedDate = S.TicketUpdatedDate,img = S.img FROM Tickets t JOIN Tmptablenew AS S ON t.TicketID = S.TicketID and T.CRMConnectionID = S.CRMConnectionID";
cmd.CommandText = mergeSql;
cmd.ExecuteNonQuery();
cmmd.CommandText = mergesql1;
cmmd.ExecuteNonQuery();
cmd.CommandText = "drop table Tmptablenew";
cmd.ExecuteNonQuery();
//Clean up the temp table
conn.Close();

【问题讨论】:

  • 请用代码做一些事情并描述问题
  • 什么是错误?在哪条线上?我们需要更多细节..
  • 显然“数据库中已经有一个对象”。您不能创建与已经存在的对象同名的对象。所以要么摆脱一个已经存在的,要么不要尝试创建一个新的。
  • 获取您的内联 SQL 并使用 SQL 管理工作室中的值执行它 - 我猜您的合并事务有问题。我也会把它移到一个存储过程中。
  • 只有一行试图创建任何东西,这是第三行。 Tmptablenew 已经存在。

标签: c# mysql sqlbulkcopy


【解决方案1】:

您正在创建表Tmptablenew,看起来该表已经存在于数据库中。

我认为,您正在尝试创建一个临时表,在这种情况下,将其创建为 MySQL 的 CREATE TEMPORARY TABLE 或使用表名 #Tmptablenew 的 MS SQL。同样在这种情况下,它会在会话关闭时自动删除。

编辑

因此,如果您使用的是 MySQL(根据您问题的标签),则必须更改 string temptable = "CREATE TEMPORARY TABLE [dbo].[Tmptablenew]([TicketID]... 等等。或者如果它是 MS SQL(我怀疑),那么 string temptable = "CREATE TABLE [dbo].[#Tmptablenew]([TicketID]... 等等(在这种情况下,您应该在代码中的任何位置将其命名为 #Tmptablenew)。

【讨论】:

  • 我的 SQL 不是很流利,但谷歌会帮助你加载这里来学习如何创建它。 dev.mysql.com/doc/refman/5.1/en/create-table.html
  • 我尝试了你的代码,现在我得到了以下异常,错误是 System.InvalidOperationException:无法访问目标表 'Tmptablenew'。 ---> System.Data.SqlClient.SqlException:无效的对象名称'Tmptablenew'。
  • @user3226735 让我们澄清一下。您是在使用问题标签上所说的 mysql 还是 mssql?然后,如果它是 MS Sql - 您是否将代码中所有出现的 Tmptablenew 更改为 #Tmptablenew?还有 SqlBulkCopy 的DestinationTableName
  • 我正在使用 MSSql,我尝试使用 #tmptablenew 我得到了我在之前评论中提到的异常。
  • @user3226735 修改了您的代码,又发现了一个问题。你不应该在bulk.WriteToServer(result); 之后关闭连接,然后再打开它,因为临时表只有在创建它的连接打开时才可见。
猜你喜欢
  • 2020-07-02
  • 2019-05-12
  • 2011-03-29
  • 2016-04-08
  • 2014-08-01
  • 2010-11-12
  • 2021-05-10
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多