试图使MS SQL存储CRLF

时间:2013-05-21 20:22:43

标签: vb.net ms-access sql-server-2008-r2

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

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

W3.org Section: 2.11 End-of-Line Handling

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

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

即使直接通过SSMS或VS SQL编辑器编辑或插入记录,我也会看到相同的结果。这些记录最初是通过网络服务提交的,但我已将其删除以进行测试。我读到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

由于

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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引入了其他令人困惑的图层。