如何让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
由于
答案 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
引入了其他令人困惑的图层。