在gridview更新期间删除字符

时间:2013-11-15 18:38:24

标签: asp.net tsql gridview sql-server-2012

更新 - 请注意,我正在努力通过SQL 2012解决方案解决此挑战。

我正在尝试制作一个SQL拼图,我确信它有一个简单的解决方案但是我现在正在转动它。我正在尝试使用gridview中的一个字段,我需要在第一次输入一个长文件名,并在更新过程中删除文件名左侧的六个字符。已经输入了gridview中的其余字段,因此这不是INSERT方案,而是UPDATE操作。我已经找到了基本命令(LEFT),但我需要做的是让页面背后的代码(我假设使用SQL代码)采用这种格式的文件名:

以下是代码:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="line" HeaderText="Line" SortExpression="line" InsertVisible="False" />
<asp:BoundField DataField="data" HeaderText="Data" SortExpression="data" />
<asp:BoundField DataField="new_data" HeaderText="New Data" SortExpression="new_data" />
<asp:CommandField ShowEditButton="True" />
</Columns>
</asp:GridView>

输出代码看起来像这样......

行数据新数据
.................................................. .................................................. .........................
 1 131024_000000-A_blah_de_blah_1of12.pdf 131024
 2 131024_000000-A_blah_de_blah_1of12.rtf
 3 131024_000000-A_blah_de_blah_2of12.pdf
 4 131024_000000-A_blah_de_blah_2of12.rtf
 5 131025_000000-A_blah_de_blah_3of12.pdf

依旧......

我正在尝试做的是通过SQL找到一种方法来获取数据列中幕后的文件名,切掉前六位数右边的文件名,然后将其写入'new_data'列。

这是我尝试过的:

UPDATE  [dbo].[left_test] 
SET [new_data] = 
(SELECT LEFT(Data,6) 
FROM [dbo].[left_test])
WHERE [data] = @data;
GO

产生以下错误:

Msg 512, Level 16, State 1, Line 2
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.

INSERT INTO dbo.left_test new_data(data) 从dbo.left_test中选择LEFT(data,6)

由于我没有使用过这种情况,因此我没有最简单的想法如何在此gridview中加入更新语句并利用左命令(如果这是必需的)。我是否在更新gridview时创建存储过程并调用它,还是在SQL UPDATE代码中间将代码添加到ASP页面?

如果此处需要更多信息,请告知我们。

3 个答案:

答案 0 :(得分:1)

对于UPDATE命令,只需使用.Substring()方法将六个字符的字符串发送到在代码中构建SQL语句的逻辑,如下所示:

var longFilename = "131114_blahblahblahblahblah_moreblahblahblahblah.doc";
var sixCharName = longFilename.Substring(0, 6);

现在将sixCharName发送到构建UPDATE SQL语句的逻辑。

答案 1 :(得分:1)

此部分返回要在一条记录中更新的多条记录,这些记录失败:

(SELECT LEFT(Data,6) 
FROM [dbo].[left_test])

您应该将SQL更改为:

UPDATE  [dbo].[left_test] 
SET [new_data] =  LEFT(Data,6) 
WHERE [data] = @data;
GO

<强>解释

  1. 此子查询 SELECT LEFT(Data,6) FROM [dbo].[left_test]) 返回多条记录,所有记录中的前6个字符。但是你只需要具有相同id的那个。你可以这样修理它:

    SELECT LEFT(数据,6) 来自[dbo]。[left_test] WHERE [data] = @data

  2. 由于您要更新同一行,因此子查询:

    SELECT LEFT(Data,6) FROM [dbo].[left_test] WHERE [data] = @data

    相同

    LEFT(Date, 6)

答案 2 :(得分:0)

您可以创建一个函数,使用_作为分隔符来查找名称的第一部分。然后将查询用作子查询并更新表。

以下是一个例子:

UPDATE TableToUpdate
SET ColumnInTable = SubQueryWithData.FileName
From
(SELECT  SUBSTRING(data.columndata, 0 ,CHARINDEX('_', data.ColumnData) ) AS FileName
FROM    ( SELECT   1 AS RecordID, '123456_789' AS ColumnData
        ) AS Data) AS SubQueryWithData
        WHERE TableToUpdate.ID = SubQueryWithData.ID