在asp.net中如何将DataSet类型的数据集转换为List类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在asp.net中如何将DataSet类型的数据集转换为List类型相关的知识,希望对你有一定的参考价值。

在你的当前类文件里添加一个静态方法,用于强制转换的。
public
static
explicit
operator
List<StocktableSubLst>(DataSet
dataSet)//实现显式转换为List<StcktableSubLst>数据类型的方法,注意这里的修饰符和关键字的写法

List<StocktableSubLst>
retList
=
new
List<StocktableSubLst>();
//对dataSet进行处理
return
retList
;
参考技术A 既然有分拿,那么我凑个热闹。
比如以SqlDataReader作为数据集合:
(实体)model:
public
class
users

public
string
username()get;set;
public
string
password()get;set;

private
users
getmodel(SqlDataReader
dr)

users
model
=
new
users;
model.username
=
dr["username"].Tostring();
model.password
=
dr["password"].Tostring();
return
model;

private
List<users>
getlist(SqlDataReader
dr)

List<users>
lst
=
new
List<users>
while(dr.read())

lst.Add(getmodel(dr));

return
lst;

以其它的作为数据集,也是换汤不换药

如何将字符串变量分配给数据集?

【中文标题】如何将字符串变量分配给数据集?【英文标题】:How to assign a String variable to a dataset? 【发布时间】:2021-11-28 06:09:54 【问题描述】:

我从文件中读取行,检查第一行,然后我必须使用适用于 DataSet 的方法将文件的下一行写入名为“TestTable”的表中。它告诉我不能在 DataSet 中插入字符串类型。

Dim myStream As Stream = Nothing
    Dim openFileDialog1 As New OpenFileDialog()

    openFileDialog1.InitialDirectory = "Z:\FitalogItalia\KMaster\SPEKM"   'ATTENZIONE CAMBIARE IN "C:\"
    openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
    openFileDialog1.FilterIndex = 2
    openFileDialog1.RestoreDirectory = True


    If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
        Try
            myStream = openFileDialog1.OpenFile()
            If (myStream IsNot Nothing) Then
                Dim objReader As New StreamReader(openFileDialog1.FileName)
                Dim ControlLine As String = ""
                Dim sLine As String = ""
                Dim arrText As New ArrayList()
                ControlLine = objReader.ReadLine
                If (ControlLine.Contains("H06") And ControlLine.Contains("SPEKM")) Then
                    sLine = objReader.ReadLine
                    Dim indice As Integer = 0
                    Do

                        If Not sLine Is Nothing Then
                            arrText.Add(sLine)
                            DB_SQL.SetDBfromDataset("INSERT INTO TestTable (riga) VALUES (" + arrText.Item(indice) + ");", "TestTable")
                            indice = +1
                        End If

                    Loop Until objReader.ReadLine.Count - 1
                End If
                objReader.Close()


            End If
        Catch Ex As Exception
            MessageBox.Show(Ex.Message)
        Finally
            ' Check this again, since we need to make sure we didn't throw an exception on open.
            If (myStream IsNot Nothing) Then
                myStream.Close()
            End If
        End Try
    End If

更新我添加了将数据加载到数据库的函数。问题是数组列表,因为我需要传递一个数据集

Public Function SetDBfromDataset(ByVal ds As Data.DataSet, ByVal TN As String) As Integer
DBadapter.InsertCommand = New SqlCommand
        TmpSQLstring = "INSERT INTO " & TN

        ' ottengo la lista dei campi
        ListFields = " ("


        For Each myCol In ds.Tables(0).Columns

            If (Not IsPrimaryCol(myCol, PKcols)) And (NormalizeDataTypeToDBtype(myCol) <> SqlDbType.Timestamp) Then
                ListFields = ListFields & Trim(myCol.ColumnName)
                ListFields = ListFields & ","
            End If
        Next
        ListFields = Mid$(ListFields, 1, Len(ListFields) - 1) & ")"

        'ottengo la lista dei parametri
        ListParam = " VALUES ("
        For Each myCol In ds.Tables(0).Columns
            If (Not IsPrimaryCol(myCol, PKcols)) And (NormalizeDataTypeToDBtype(myCol) <> SqlDbType.Timestamp) Then
                ListParam = ListParam & "@" & Trim(myCol.ColumnName)
                ListParam = ListParam & ","
                DBadapter.InsertCommand.Parameters.Add(New SqlParameter("@" & Trim(myCol.ColumnName), NormalizeDataTypeToDBtype(myCol)))
                DBadapter.InsertCommand.Parameters("@" & Trim(myCol.ColumnName)).SourceColumn = Trim(myCol.ColumnName)
            End If
        Next
        ListParam = Mid$(ListParam, 1, Len(ListParam) - 1) & ")"
        DBadapter.InsertCommand.CommandText = TmpSQLstring & ListFields & ListParam
        DBadapter.InsertCommand.Connection = CType(DBadapter.SelectCommand.Connection, SqlConnection)
        
 End Function

【问题讨论】:

真正的问题是你为什么要注入你的价值而不是参数化它。 参数化在哪里? VALUES (" + arrText.Item(indice) + ") 那是注入。您应该使用参数VALUES (@txt) 并单独传递值 +1 在参数化上,但您的实际问题是数据类型不匹配。 TestTable.riga 不是字符串。通过用“”包围您要插入的值,您暗示它是。天气是否为字符串,类型必须匹配 【参考方案1】:

Streams 需要通过调用Dispose 或放在Using 块中来处理。这是一个文本文件,因此您甚至不需要流。

ArrayList 是为了向后兼容,但您不应该在新代码中使用。见https://docs.microsoft.com/en-us/dotnet/api/system.collections.arraylist?view=net-5.0#remarks 一个很好的替代品是List(Of T)

我已将代码分成 3 种方法。您在一个方法中执行了太多单独的任务。我使用System.IO.File 类来读取文件。 ReadAllLines 返回文件中行的数组。然后是一个简单的 For Each 循环来识别要添加到数据库的行。我使用List(Of String) 来收集线路。然后将列表传递给InsertText中的数据库代码。

只有参数的值在循环中改变。

Private Sub OPCode()
    Dim FilePath = GetFilePath()
    If FilePath Is Nothing Then
        MessageBox.Show("No file selected.")
    End If
    Dim lst As New List(Of String)
    Dim lines = File.ReadAllLines(FilePath)
    For Each line In lines
        If line.Contains("H06") AndAlso line.Contains("SPEKM")) Then
            lst.Add(line)
        End If
    Next
    InsertText(lst)
End Sub

Private Function GetFilePath() As String
    Dim openFileDialog1 As New OpenFileDialog()
    openFileDialog1.InitialDirectory = "Z:\FitalogItalia\KMaster\SPEKM"   'ATTENZIONE CAMBIARE IN "C:\"
    openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"
    openFileDialog1.FilterIndex = 2
    openFileDialog1.RestoreDirectory = True
    If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
        Return openFileDialog1.FileName
    Else
        Return Nothing
    End If
End Function

Private Sub InsertText(lst As List(Of String))
    Using cn As New SqlConnection("Your connection string"),
            cmd As New SqlCommand("INSERT INTO TestTable (riga) VALUES (@riga);", cn)
        cmd.Parameters.Add("@riga", SqlDbType.NVarChar)
        cn.Open()
        For Each line In lst
            cmd.Parameters("@riga").Value = line
            cmd.ExecuteNonQuery()
        Next
    End Using 'closes the connection and disposes the command and the connection
End Sub

【讨论】:

以上是关于在asp.net中如何将DataSet类型的数据集转换为List类型的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET 中拉多个记录集时的 DataReader 或 DataSet

DataSet——合二为一,合并两个数据集的数据内容

从 .net 类型的数据集插入时,备注字段值被截断为大约 1000 个字符

ASP.NET 自己定义一个DataSet或者DataTable,如何把数据写到里边去

如何在打字稿中验证输入标签的类型“target.dataset”属性

asp.net 通过反射的一个方法,得到返回值,是object 类型的。怎么遍历里边的IList?