0

我有一个名为“News-News”的表格,可以在其中保存我网站的新闻。我使用“int”和“nvarchar(3999)”数据类型向该表添加了新的四列。问题出在这里:我可以将数据类型更改为“nvarchar(50)”并且可以成功保存,但是当我想再次将其更改为“nvarchar(3999)”时,它返回此错误:

'News-News' table- Unable to modify table.  Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

问题还没有结束!我可以将数据插入此表,但我无法删除和更新它。这是错误:

string or binary data would be truncated
The data in row 1 was not committed
.Net SqlClient Data Provider

这是表格完整代码:

/****** Object:  Table [dbo].[News-News]  ******/

    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](399) NOT NULL,
    [Abstract] [ntext] NULL,
    [Value] [ntext] NULL,
    [UserID] [int] NOT NULL,
    [GroupID] [int] NOT NULL,
    [Date] [nvarchar](3999) NOT NULL,
    [Views] [int] NULL,
    [Hates] [int] NULL,
    [Likes] [int] NULL,
    [Source] [nvarchar](3999) NULL,
 CONSTRAINT [PK_News-News] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Hates 、 Likes 、 Views 和 Source 列是新的。

我在 MS SQL Management Studio 和我的 ASP.NET 网站上遇到了这个问题。两者都有相同的超时问题。


更新 我有一个名为“NewsSqlDataSource”的 SqlDataSource,其中包含三个查询“插入”、“更新”和“删除”。我NewsSqlDataSource.Insert();用于插入、 NewsSqlDataSource.Update();编辑和NewsSqlDataSource.Delete();删除。这里我有查询代码:

  • 用于插入

INSERT INTO [News-News] (Title, Abstract, Value, UserID, GroupID, Date, Source) VALUES (@title, @Abstract, @Value, @UserID, @GroupID, @Date, @Source)

  • 用于更新

UPDATE [News-News] SET Title = @Title, Abstract = @Abstract, Value = @Value, Date = @Date, GroupID = @GroupID, Source = @Source WHERE (ID = @ID)

  • 用于删除

DELETE FROM [News-News] WHERE (ID = @ID)

4

2 回答 2

5

您无法插入数据,因为您尝试插入的数据对于该列来说太宽并且ANSI_WARNINGSON. 鉴于您的应用程序的内容,您可能不想打开它OFF并让服务器静默截断数据。

您遇到的另一个错误可能是由于您的表变得越来越大并且 SQL Server 消耗了太多资源,因为它本质上是将数据存储在工作表中,然后使用临时对象和 RAM 更新原始表.

这就是我要做的。

SELECT 
    [ID],
    [Title],
    [Abstract],
    [Value],
    [UserID],
    [GroupID],
    [Date],
    [Views],
    [Hates],
    [Likes],
    [Source]
INTO dbo.[News-News_Newest]
FROM [dbo].[News-News];

DROP TABLE [dbo].[News-News_Newest];
GO

EXEC sp_rename '[News-News_Newest]' , '[News-News]';
GO

ALTER TABLE [News-News]
  ADD CONSTRAINT PK_News_ID PRIMARY KEY CLUSTERED (ID ASC);

请注意,如果存在外键,您将需要弄清楚如何处理它们。您还需要确保在执行此操作时不会在此表上发生写入。

于 2013-07-26T17:33:34.437 回答
2

刚才看到你用SSMS的设计模式换表。这是一个错误,如果表中包含大量数据,则永远不应以这种方式更改表。就我个人而言,我觉得你永远不应该使用设计器,因为代码应该在源代码控制中的脚本中,这样你就可以轻松地将它从 dev 转移到生产中。Alter table 通常比使用将所有数据加载到临时表然后进行更改然后加载数据库的设计器要快得多。如果您有大量数据,那么您将遇到使用设计器的超时问题。

于 2013-07-26T17:52:46.117 回答