【问题标题】:Importing Excel data into SQL Server database将 Excel 数据导入 SQL Server 数据库
【发布时间】:2018-04-17 14:34:59
【问题描述】:

我想通过对话框选择将Excel图表导入我的SQL Server数据库并自动将其保存到SQL Server表中+我想通过我制作的子生成记录ID。

生成MembersID的子是:

Public MyNewMembersID As Integer
Public Sub Code_Members()
    Dim dt As New DataTable
    Dim da As New SqlDataAdapter("select max(MembersID) from Members", Con)
    da.Fill(dt)
    If IsDBNull(dt(0)(0)) = True Then
        MyNewMembersID = 1
    Else
        MyNewMembersID = dt(0)(0) + 1
    End If

这是我的代码,错误提示 MembersID 不能为 NULL:

Imports System.IO
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.Configuration

Public Class MembersImport
    Private Sub MembersImport_FilePath_Button_Click(sender As Object, e As EventArgs) Handles MembersImport_FilePath_Button.Click
        MembersImport_OpenFileDialog.ShowDialog()
    End Sub

    Private Sub MembersImport_ImportFile_Button_Click(sender As Object, e As EventArgs) Handles MembersImport_ImportFile_Button.Click
        If MembersImport_FilePath_TextBox.Text = "" Then
            MsgBox("Please Select File Excel", MsgBoxStyle.RetryCancel, "File Not Found")
            MembersImport_FilePath_Button.PerformClick()
        Else
            Dim con_excel As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & MembersImport_FilePath_TextBox.Text & "';Extended Properties=""Excel 12.0 Xml;HDR=Yes""")
            con_excel.Open()
            Dim query_excel As String = "Select * from [Sheet1$]"
            Dim cmd As OleDbCommand = New OleDbCommand(query_excel, con_excel)
            Dim rd As OleDbDataReader
            Dim con_sql As New SqlConnection()
            Dim con_sqlDB As String = "Data Source=(localdb)\ProjectsV13;Initial Catalog=Euro_SQL_Server;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
            con_sql.ConnectionString = con_sqlDB
            con_sql.Open()
            Using BulkCopy As SqlBulkCopy = New SqlBulkCopy(con_sql)
                BulkCopy.DestinationTableName = "dbo.Members"
                Try
                    rd = cmd.ExecuteReader
                    BulkCopy.WriteToServer(rd)
                    rd.Close()
                    con_sql.Close()
                    MsgBox("تم الاسترداد بنجاح")
                    MembersImport_FilePath_TextBox.Text = ""
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try
            End Using
            Load_Members()
            Me.Close()
        End If
    End Sub

    Private Sub MembersImport_OpenFileDialog_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles MembersImport_OpenFileDialog.FileOk
        MembersImport_FilePath_TextBox.Text = MembersImport_OpenFileDialog.FileName
    End Sub
End Class

这是我的表结构:

CREATE TABLE [dbo].[Members] 
(
    [MembersID] INT NOT NULL,
    [MembersName] NVARCHAR(MAX) NULL,
    [MembersGender] NVARCHAR(MAX) NULL,
    [MembersPhone] NVARCHAR(MAX) NULL,
    [MembersAddress] NVARCHAR(MAX) NULL,
    [MembersMembershiping] BIT NULL,
    [MembersMembershipNum] NVARCHAR (MAX) NULL,
    [MembersMembershipValidityFrom] DATE NULL,
    [MembersMembershipValidityTo] DATE NULL,
    [MembersSubscriberSystem] NVARCHAR(MAX) NULL,
    [MembersCarBrand] NVARCHAR(MAX) NULL,
    [MembersCarModel] NVARCHAR(MAX) NULL,
    [MembersCarManufacturingYear] NVARCHAR(MAX) NULL,
    [MembersCarNum] NVARCHAR(MAX) NULL,
    [MembersChassisNum] NVARCHAR(MAX) NULL,
    [MembersCarColor] NVARCHAR(MAX) NULL,
    [MembersNotes] NVARCHAR(MAX) NULL,
    [ActionBy] NVARCHAR(MAX) NULL,

    PRIMARY KEY CLUSTERED ([MembersID] ASC)
);

所以我只需要将生成的MembersID 中的 Excel 中的数据导入 SQL Server 数据库

【问题讨论】:

  • 在英语中你会将每个单词都大写 ....
  • 另外:您应该使用适当的字符串长度 - 不要只制作NVARCHAR(MAX) 的所有内容,因为您懒得考虑字符串的适当长度。 MAX 类型很棒 - IF 你真的需要多达 20 亿个字符 - 但是电话号码?!?!?!?真的 !?!?!??!?还是性别??来吧 - 你可以做得比这更好!
  • @marc_s loool 你是对的人,我直到现在才被你重新定义它,我在这里仍然是菜鸟:D 所以请原谅我的低知识:V

标签: sql sql-server excel vb.net visual-studio


【解决方案1】:

您不会在代码中生成 ID。您可以通过将 ID 字段设置为身份字段来生成 ID。

【讨论】:

  • 是的,我从这里得到了它link 现在我该怎么做呢??
  • 我已经通过添加 sql 表代码 IDENTITY(1,1) 来修复它,现在变成了 [MembersID] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  • Google“将字段更改为身份 sql server”。
  • 改为 bigint 而不是 int。
  • 非常感谢IDENTITY(1,1),我会尝试将INT更改为bigint,正如你所说但现在它工作稳定,因为我需要
【解决方案2】:

这是很多MAX!我猜你正在把它带到MAX。无论如何,你可以这样尝试吗?下面的脚本应该做你想做的。

Public Sub ImportDataFromExcel(excelFilePath As String) 
        'declare variables - edit these based on your particular situation 
        Dim ssqltable As String = "Table1" 
        ' make sure your sheet name is correct, here sheet name is sheet1, so you can change your sheet name if have    different 
        Dim myexceldataquery As String = "select student,rollno,course from [sheet1$]" 
        Try 
            'create our connection strings 
            Dim sexcelconnectionstring As String = (Convert.ToString("provider=microsoft.jet.oledb.4.0;data source=") & excelFilePath) + ";extended properties=" + """excel 8.0;hdr=yes;""" 
            Dim ssqlconnectionstring As String = "Data Source=SAYYED;Initial Catalog=SyncDB;Integrated Security=True" 
            'execute a query to erase any previous data from our destination table 
            Dim sclearsql As String = Convert.ToString("delete from ") & ssqltable 
            Dim sqlconn As New SqlConnection(ssqlconnectionstring) 
            Dim sqlcmd As New SqlCommand(sclearsql, sqlconn) 
            sqlconn.Open() 
            sqlcmd.ExecuteNonQuery() 
            sqlconn.Close() 
            'series of commands to bulk copy data from the excel file into our sql table 
            Dim oledbconn As New OleDbConnection(sexcelconnectionstring) 
            Dim oledbcmd As New OleDbCommand(myexceldataquery, oledbconn) 
            oledbconn.Open() 
            Dim dr As OleDbDataReader = oledbcmd.ExecuteReader() 
            Dim bulkcopy As New SqlBulkCopy(ssqlconnectionstring) 
            bulkcopy.DestinationTableName = ssqltable 
            While dr.Read() 
                bulkcopy.WriteToServer(dr) 
            End While 
            dr.Close() 
            oledbconn.Close() 
            Label1.Text = "File imported into sql server." 
            'handle exception 
        Catch ex As Exception 
        End Try 
    End Sub

【讨论】:

  • 我的代码几乎和你的一样..我的问题出在 MembersID 上,它是主键,即使在 excel 上也不能为空,没有 MembersID 列,我想生成它将工作表导入数据库时​​自动
  • 我在网上寻找一种方法来处理这个问题,但并没有想出太多。我了解 MemberID 不能为空。你能简单地把那些记录踢出去吗?任何以 NULL 形式出现的东西都不应该是有效的记录,对吧。或者,一旦所有内容都在您的表中,只需对这些 NULL 运行删除查询。从 YourTable 中删除 MembersID 为 NULL;
  • 非常感谢您的关注IDENTITY(1,1) 来修复它,现在变成了 [MembersID] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2020-02-27
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多