1

如何让 SQL 2008 R2 将嵌入在字符串中的 CR/LF(所以 2 个段落,或者可能是多个 CR/LF)存储到以编程方式插入 vb.net 的记录的字段中?并非所有记录都有 CR/LF,所以我不能只将它们添加到每条记录中。+Char(13)+char(10) 我可以用 charArrary 拆分。

更新:这似乎是实际问题:XML 解析器将 CR/LF 转换为 LF 只是为了保持一致性。我正在将数据传入和传出 Web 服务,这似乎是 CR 丢失的地方。这是 W3 标准。

W3.org 部分:2.11 行尾处理

这些字符串来自 Access DB,并且 CR/LF 已包含在记录的多段字段中。我想直接将它们传递进去,但 SQL 正在将它们转换为空格。

在 VS Sql 编辑器中,记录似乎存储 CR/LF 应该驻留的 20:20 Hex。该字符串实际上应该有 Char(13) & Char(10) 或 0x0D0A 但它没有。

即使直接通过 SSMS 或 VS SQL 编辑器编辑或插入记录,我也看到了相同的结果。这些记录最初是通过 Web 服务提交的,但我已将其删除以进行测试。我读到 XML 解析器也会将 CR/LF 转换为 LF,只是为了保持一致性。

我无法显示实际的查询。但是适配器是在此处构建并填充并通过 Web 服务调用传递回我的应用程序的。此过程适用于除包含 CRLF 的记录之外的所有记录。

Dim strConnection As String
strConnection = ConfigurationManager.ConnectionStrings("ConnectionStringMyDB").ConnectionString

        Dim myConnection As New SqlConnection(strConnection)
        Dim myCommand As New SqlCommand(strSQL, myConnection)

' Access file name
myCommand.Parameters.AddWithValue("@dbName", OleDbType.VarChar).Value = dbName

' Table in Access DB           
myCommand.Parameters.AddWithValue("@tableName", OleDbType.VarChar).Value = tableName  

myConnection.Open()

' Create the DataAdapter
Dim myDataAdapter As New SqlDataAdapter()
myDataAdapter.SelectCommand = myCommand

' Populate the DataSet and close the connection
Dim myDataSet As New DataSet()
myDataAdapter.Fill(myDataSet)
myConnection.Close()

Return myDataSet

将数据集分配给表后在我的应用程序中进行处理。

For Each row As DataRow In myTable.Rows
    Dim stringVal As String = row(columnName).ToString()

    ' Eventually added this to see that the row was adding 2 spaces after the carriage return
    Dim cstringVal() As Char = stringVal.ToCharArray
    Dim csearchValue() As Char = searchValue.ToCharArray

   ' Also added this code
       Dim line_array1 As [String]() = stringVal.Split(vbCr & vbLf.ToCharArray())
       Dim line_array2 As [String]() = searchValue.Split(vbCr & vbLf.ToCharArray())

    ' line_Array2 consistently IDs the vbCRLF, line_array1 never does.


    ' Originally tried
    If row(columnName) = searchValue Then
        return True
    End If

    ' Tried this
    If stringVal = searchValue Then
        Return True
    End If

    ' And this
     If String.Compare(stringVal, searchValue, False) = 0 Then
        Return True
     End If
   Next
Return False

谢谢

4

2 回答 2

1

也许问题是UNICODE。根据我的经验,存储没有问题CRLF,但 UNICODE <-> ASCII 可能有问题。

请试试

Dim cmd as SQLCommand
cmd.CommandText = "insert into MyTable(fld) values (N'" + VariableContainingCRLF +"')"
cmd.ExecuteNonQuery

或者

Dim cmd as SQLCommand
cmd.CommandText = "insert into MyTable(fld) values (@param)"
cmd.Parameters.Add("@param", SqlDbType.NVarChar, 50).Value = VariableContainingCRLF
cmd.ExecuteNonQuery

N字符串或之前的字母NVarChar是至关重要的。DataAdapter引入了其他令人困惑的层。

于 2013-05-21T21:41:53.560 回答
1

您正在混淆数据存储和数据显示和编辑。

我刚刚验证了 SQL Server 确实将 CRLF 存储在 VARCHAR 字段中:

insert into MyTable (VarcharField)
values ('A'+CHAR(13)+'B')
, ('A'+CHAR(13)+CHAR(10)+'B')
, ('A
B')

通过检查插入字符串的 ASCII() 代码

SELECT VarcharField, LEN(VarcharField),
  , ASCII(substring(VarcharField, 2, 1))
  , ASCII(substring(VarcharField, 3, 1))
FROM MyTable

CR 和 CRLF显示为空格,但它们仍存储为 0x0D 和 0x0A,或 13 和 10。

于 2013-05-21T20:44:01.497 回答