C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[24]: Excelインポートしてテーブルへの追加 [1]


(過去ログ 74 を表示中)

[トピック内 32 記事 (21 - 32 表示)]  << 0 | 1 >>

■42849 / inTopicNo.21)  Re[13]: Excelインポートしてテーブルへの追加
  
□投稿者/ もりお (114回)-(2009/10/22(Thu) 11:31:50)
No42830 (nao さん) に返信
> select文は OPENROWSET以降にfilePathを指定し、[$sheet1]と記述したのですが・・・
$ は後ろにつけてください。
[Sheet1$]
引用返信 編集キー/
■42888 / inTopicNo.22)  Re[14]: Excelインポートしてテーブルへの追加
□投稿者/ nao (33回)-(2009/10/22(Thu) 22:44:54)
No42849 (もりお さん) に返信
> ■No42830 (nao さん) に返信
>>select文は OPENROWSET以降にfilePathを指定し、[$sheet1]と記述したのですが・・・
> $ は後ろにつけてください。
> [Sheet1$]

お世話になっております。
すいません。
ちゃんと後ろにつけてました。

で、アップロードはもりおさんの通り記述したところ
アップロード出来ました^^
Web発行もOKでした^^
ありがとうございます。

が、・・・
グリッド表示はASP.NETのお勉強から引用

http://www.cocoaliz.com/asp.net/index/40/
しているのですが、やっぱり前述のように
「System.Data.OleDb.OleDbException: エラーを特定できません」
と、Web発行するとでてしまいます(><)
引用返信 編集キー/
■42917 / inTopicNo.23)  Re[15]: Excelインポートしてテーブルへの追加
□投稿者/ もりお (116回)-(2009/10/23(Fri) 13:53:45)
No42888 (nao さん) に返信
> やっぱり前述のように
> 「System.Data.OleDb.OleDbException: エラーを特定できません」

前回とはエラーメッセージが異なっているようですが、ローカルでは
正常に動作するのでしょうか。
ローカルで動作するとなりますと
アップロード先のアクセス権を確認してみてはいかがでしょうか。
引用返信 編集キー/
■42942 / inTopicNo.24)  Re[16]: Excelインポートしてテーブルへの追加
□投稿者/ nao (34回)-(2009/10/23(Fri) 22:38:33)
No42917 (もりお さん) に返信

出来ました〜〜〜〜\(o⌒∇⌒o)/ ワァイ♪♪♪

実際には、Webconfigの<identity impersonate="true" />
を、コメントアウト(削除)することによって出来ました^^

自分で、色々とやってるうちに自分で加えたのか?
勝手に作成されたのかよく自分でもわかってないんですが・・・^^;
多分、ソースをいじったから?できたのかな?

とりあえず、Web発行でもきちんと出来ました♪

ありがとうございますm(_ _)m アリガトォ〜★


なので、一応は解決なのか?

その後の、SQLへのInsertというのができてません(><)
だから最終解決ではない?

やじゅさんに教えていただいた、一括での登録をやっているのですが
できておりません。

Select文が間違っているのはわかっているんですが
ExcelのSeet1$の設定がうまくできずにおります。

SQLのクエリアナライザーでも試しているのですが、やっぱり、
仮:appfile=App_Dataに保存したExcelBook(アップデートしたExcel 例:\\M77574200\開発ユニット\個人フォルダ\03_nao\Book1.xls)

ss = "SELECT * INTO test_naoa FROM OPENROWSET("'" & appfile "'", [Sheet1$])"
と、しているのですが、Sheet1でもエラーメッセージ、appfileでもエラーとなってしまいます。

もしも別トピックの方がよろしければそちらにいたしますが・・・
その時はご指導お願いします。

また、このままでよろしければ、そのままご教授願いますm(_ _)m
引用返信 編集キー/
■42978 / inTopicNo.25)  Re[17]: Excelインポートしてテーブルへの追加
□投稿者/ もりお (119回)-(2009/10/26(Mon) 02:21:58)
No42942 (nao さん) に返信
> ss = "SELECT * INTO test_naoa FROM OPENROWSET("'" & appfile "'", [Sheet1$])"
> と、しているのですが、Sheet1でもエラーメッセージ、appfileでもエラーとなってしまいます。

どのようなエラーなのでしょうか。


excel の DataTable を元に SQL Server への Insert クエリーを発行するという手もあります。

Public Sub insertFromExcel(ByVal excelTable As DataTable)
    Using connection As New SqlConnection(connectionString)
        Using insertCommand = New SqlCommand( _
            "INSERT INTO [namer] ( name ) VALUES( @name )", connection)

            Dim nameParameter As SqlParameter = _
                insertCommand.Parameters.Add("@name", SqlDbType.NVarChar)

            connection.Open()

            For Each excelRow As DataRow In excelTable.Rows
                nameParameter.Value = excelRow(0)
                insertCommand.ExecuteNonQuery()
            Next

            connection.Close()
        End Using
    End Using
End Sub

引用返信 編集キー/
■43045 / inTopicNo.26)  Re[18]: Excelインポートしてテーブルへの追加
□投稿者/ nao (35回)-(2009/10/27(Tue) 20:39:20)
2009/10/28(Wed) 18:57:25 編集(投稿者)
2009/10/28(Wed) 18:57:14 編集(投稿者)

No42978 (もりお さん) に返信
いつも、ありがとうございます。(一部修正しています)

> どのようなエラーなのでしょうか。

[Sheet1$]の近くに無効な構文があります。
ってエラーメッセージです。
>
> excel の DataTable を元に SQL Server への Insert クエリーを発行するという手もあります。
>
試させていただきました・・・
が、Usingっていうのはエラーにはなりませんでしたが、これってC#とかではなく?

excelのDataTableというのはどういうことなのか分かってないんですが・・・
色々とexcelファイルを読み込むということなのでしょうか?
(色々と調べたりはしたのですが基本がわかっておらず申し訳ございません)

ByVal excelTable As DataTable
の部分を

dim excelTable as new DataTable
としたことでエラー解決出来ました。
が、DataTableにExcelファイルを読み込ませる方法がわかりません。

どのようにDataTableにExcelファイルを読み込ませるのでしょうか?
なので、きちんと通るのですがDataTableがNothingの状況なので何も起こりません。(当たり前ですが・・・)

よろしくお願いいたします。
引用返信 編集キー/
■43089 / inTopicNo.27)  Re[19]: Excelインポートしてテーブルへの追加
□投稿者/ もりお (120回)-(2009/10/28(Wed) 20:30:48)
No43045 (nao さん) に返信
> Usingっていうのはエラーにはなりませんでしたが、これってC#とかではなく?

VB.NET です。実行時に Try Finally に展開されます。
オブジェクトの破棄を保証するときに使います。

Visual Basic 言語リファレンス
    Using ステートメント (Visual Basic)
http://msdn.microsoft.com/ja-jp/library/htd05whh(VS.80).aspx

> DataTableにExcelファイルを読み込ませる方法がわかりません。

GridView に Excel のデータを表示する際、DataTable に読み込んでいるはずですので
それを利用すると善いかと思われます。
GridView に表示するところのコードをお教えいただけると具体的な助言
が出来るかもしれません。

引用返信 編集キー/
■43142 / inTopicNo.28)  Re[20]: Excelインポートしてテーブルへの追加
□投稿者/ nao (36回)-(2009/10/29(Thu) 21:41:17)
No43089 (もりお さん) に返信
>
> VB.NET です。実行時に Try Finally に展開されます。
> オブジェクトの破棄を保証するときに使います。
ありがとうございます。

是非、ご教授願います。

Partial Class _Default
Inherits System.Web.UI.Page

Dim constr As String = ConfigurationManager.ConnectionStrings("TEST_JUCHU4ConnectionString").ToString
Dim con1 As New SqlConnection(constr)

Protected Sub Submit1_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Submit1.ServerClick
Dim fn As String = System.IO.Path.GetFileName(File1.PostedFile.FileName)
Dim SaveLocation As String = Server.MapPath("App_Data") & "/ " & fn
If Not File1.PostedFile Is Nothing And File1.PostedFile.ContentLength > 0 Then

Try
File1.PostedFile.SaveAs(SaveLocation)
Response.Write("アップロードできた♪^^")
Catch ex As Exception
Response.Write("やっぱりだめか・・・")
End Try


Dim con As OleDbConnection
Dim cmd As OleDbCommand

Dim da As OleDbDataAdapter
Dim ds As DataSet
Dim sConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=""" & SaveLocation & """;" _
& "Extended Properties=""Excel 8.0;HDR=YES"""

'OleDbConnectionの生成
con = New OleDbConnection(sConnectionString)

'接続
con.Open()

'OleDbCommandの生成
cmd = New OleDbCommand("SELECT * FROM [Sheet1$]", con)

'OleDbDataAdapter作成
da = New OleDbDataAdapter
da.SelectCommand = cmd

'DataSetの生成
ds = New DataSet
da.Fill(ds, "Excel")

'GridViewに配置、DataBind
GridView1.DataSource = ds.Tables(0).DefaultView
GridView1.DataBind()

'接続を閉じる
con.Close()
Call insertFromExcel()
Else
Response.Write("ファイル選択してね")
End If
End Sub
Public Sub insertFromExcel()
Dim excelTable As New DataTable
Using connection As New SqlConnection(constr)
Using insertCommand = New SqlCommand( _
"INSERT INTO test_miura ( name ) VALUES( @name )", con1)
Dim nameParameter As SqlParameter = _
insertCommand.Parameters.Add("@name", SqlDbType.NVarChar)
con1.Open()

For Each excelRow As DataRow In excelTable.Rows
nameParameter.Value = excelRow(0)
insertCommand.ExecuteNonQuery()
Next

con1.Close()
End Using
End Using
End Sub

因みに、このInsert文だと1つのセルのみのInsertになるのでしょうか?


よろしくお願いたします。
引用返信 編集キー/
■43148 / inTopicNo.29)  Re[21]: Excelインポートしてテーブルへの追加
□投稿者/ もりお (121回)-(2009/10/30(Fri) 01:55:06)
No43142 (nao さん) に返信
' データベースからデータを取得して DataTable に格納
da.Fill(ds, "Excel")

' GridView のデータソースに DataTable の DefaultView をセット
GridView1.DataSource = ds.Tables(0).DefaultView

ds.Tables(0) というのが Excel のデータが格納された DataTable です。
このデータを SQL Server にインサートすると善いのではないでしょうか。

.NET Framework クラス ライブラリ
    DbDataAdapter.Fill メソッド (DataSet, String)
http://msdn.microsoft.com/ja-jp/library/y4b211hz.aspx

> 因みに、このInsert文だと1つのセルのみのInsertになるのでしょうか?

その通りです。適宜修正が必要です。

.NET Framework クラス ライブラリ
    SqlCommand.Parameters プロパティ
http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlcommand.parameters.aspx

引用返信 編集キー/
■43183 / inTopicNo.30)  Re[22]: Excelインポートしてテーブルへの追加
□投稿者/ nao (37回)-(2009/10/30(Fri) 20:22:34)
No43148 (もりお さん) に返信
> .NET Framework クラス ライブラリ
> SqlCommand.Parameters プロパティ
> http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlcommand.parameters.aspx
ちょっと、これだけがいまいち理解できなかったんですが・・・

一応、出来ました^^
ありがとうございました。

Call insertFromExcel(ds.Tables(0))

Public Sub insertFromExcel(ByVal exceltable As DataTable)
'Dim excelTable As New DataTable
Dim name As String
Dim data As String
Dim sex As String
Dim i As Integer
For i = 0 To exceltable.Rows.Count - 1
Using connection As New SqlConnection(constr)

name = exceltable.Rows(i).Item(0)
data = exceltable.Rows(i).Item(1)
sex = exceltable.Rows(i).Item(2)

Using insertCommand = New SqlCommand( _
"INSERT INTO test_miura VALUES('" & name & "','" & data & "','" & sex & "')", con1)
Dim nameParameter As SqlParameter = _
insertCommand.Parameters.Add("@name", SqlDbType.Char)
con1.Open()

'For Each excelRow As DataRow In exceltable.Rows

nameParameter.Value = exceltable.Rows.Count
insertCommand.ExecuteNonQuery()
'Exit For
'Next

con1.Close()
End Using
End Using
Next
End Sub


この後、これを基に肉付けしていくので、またわからなくなったら
よろしくお願いいたします。

本当に、有難うございました。
解決済み
引用返信 編集キー/
■43185 / inTopicNo.31)  Re[23]: Excelインポートしてテーブルへの追加
□投稿者/ もりお (122回)-(2009/10/30(Fri) 22:57:54)
2009/10/30(Fri) 22:58:16 編集(投稿者)
No43183 (nao さん) に返信
> http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlcommand.parameters.aspx
> ちょっと、これだけがいまいち理解できなかったんですが・・・

パラメータークエリー、もしくはパラメタライズドクエリーと呼ばれるものです。

SQL の中に @... のパラメーターマーカーを記述して
INSERT INTO [test_miura] ( name, data, sex ) VALUES ( @name, @data, @sex )

パラメーターマーカーと対応するパラメーターを作成して
Dim nameParameter As SqlParameter = insertCommand.Parameters.Add("@name", SqlDbType.NVarChar)
Dim dataParameter As SqlParameter = insertCommand.Parameters.Add("@data", SqlDbType.NVarChar)
Dim sexParameter As SqlParameter = insertCommand.Parameters.Add("@sex", SqlDbType.Int)

パラメーターに値をセットするというものです。
nameParameter.Value = exceltable.Rows(i).Item(0)
dataParameter.Value = exceltable.Rows(i).Item(1)
sexParameter.Value = exceltable.Rows(i).Item(2)

SQL インジェクションの対策になりますし、コードの可読性も向上します。
積極的に利用されることをお勧めします。
定型的なものなので丸ごと覚えてしまったほうが善いかもしれません。

解決済み
引用返信 編集キー/
■43192 / inTopicNo.32)  Re[24]: Excelインポートしてテーブルへの追加
□投稿者/ nao (38回)-(2009/10/31(Sat) 12:13:40)
No43185 (もりお さん) に返信
> 2009/10/30(Fri) 22:58:16 編集(投稿者)
>
> パラメータークエリー、もしくはパラメタライズドクエリーと呼ばれるものです。
>
> SQL の中に @... のパラメーターマーカーを記述して
> INSERT INTO [test_miura] ( name, data, sex ) VALUES ( @name, @data, @sex )
>
> パラメーターマーカーと対応するパラメーターを作成して
> Dim nameParameter As SqlParameter = insertCommand.Parameters.Add("@name", SqlDbType.NVarChar)
> Dim dataParameter As SqlParameter = insertCommand.Parameters.Add("@data", SqlDbType.NVarChar)
> Dim sexParameter As SqlParameter = insertCommand.Parameters.Add("@sex", SqlDbType.Int)
>
> パラメーターに値をセットするというものです。
> nameParameter.Value = exceltable.Rows(i).Item(0)
> dataParameter.Value = exceltable.Rows(i).Item(1)
> sexParameter.Value = exceltable.Rows(i).Item(2)
>
> SQL インジェクションの対策になりますし、コードの可読性も向上します。
> 積極的に利用されることをお勧めします。
> 定型的なものなので丸ごと覚えてしまったほうが善いかもしれません。


有難うございます。

項目数が少ない場合は楽なのかもしれないけど、項目数が多いと全部書かなくちゃいけないから
結構面倒ですよね???

でも、結局項目数が多くても記述はしなきゃいけないから
こっちの方が楽、というのか動作も速いのかな?

インジェクションとは?と思い調べてきました。
わかりました。
もりおさんに教えていただいた方法に全部変更することにします^^

また分からなくなりましたらよろしくお願いいたします。
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -