ホームページ  >  記事  >  バックエンド開発  >  C# が oledb を使用して Excel に接続し、Insert Into ステートメントを実行する「更新可能なクエリを使用する必要がある」という問題を解決するサンプル コードです。

C# が oledb を使用して Excel に接続し、Insert Into ステートメントを実行する「更新可能なクエリを使用する必要がある」という問題を解決するサンプル コードです。

黄舟
黄舟オリジナル
2017-03-13 17:46:372088ブラウズ

エラーが発生した時の環境: Windows 7、Framework 4、0、Microsoft Office 2007、VS2010、c# WinForm; コードの一部:

                    string strConn = "Provider=Microsoft.Ace.OleDb.12.0;Persist Security Info=False;
                    " + "data source=" + @excelPath + ";Extended Properties='Excel 12.0; HDR=yes; IMEX=2'";
                    OleDbConnection conn = new OleDbConnection();
                    conn.ConnectionString = strConn;
                    try
                    {
                        OleDbCommand cmd = null;
                        try
                        {
                            cmd = new OleDbCommand("Insert Into [Sheet1$] Values('abc', 'bac', '0', '123456', 'test','测试','aa')", conn);//(A,B,C,D,E,F,G) 
                            cmd.ExecuteNonQuery();
                        }
                        catch (System.Exception ex)
                        {
                            textBox1.Text += ("插入数据失败:" + ex.Message);
                            textBox1.Text += ("\r\n");
                        }


エラー 最初に思い浮かぶのは、権限がないにもかかわらず、管理者として実行しても同じエラーが発生するということです。

次のコードでアクセス許可を追加しましたが、同じエラーが発生します:

FileInfo fi = new FileInfo(excelPath);
System.Security.AccessControl.FileSecurity fileSecurity = fi.GetAccessControl();
fileSecurity.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));
fileSecurity.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow));
fi.SetAccessControl(fileSecurity);

DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(excelPath));
System.Security.AccessControl.DirectorySecurity dirSecurity = di.GetAccessControl();
dirSecurity.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));
dirSecurity.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow));
di.SetAccessControl(dirSecurity);

ナレッジ チュートリアル、さらに接続があります

文字列

: Extended Properties='Excel 12.0=yes; パラメータ HDR の値:


HDR=Yes、これは最初の行がタイトルでありデータとして使用されないことを意味します。HDR=NO が使用される場合、最初の行はタイトルではなく使用されることを意味します。データとして。システムのデフォルトは YES です

パラメータ Excel 8.0 Excel 97 以降から 2003 バージョンの場合は Excel 8.0 を使用し、2007 または 2010 の場合は Extended Properties=Excel 12.0 を使用します

IMEX(IMport EXportモード)設定
IMEXには3つのモードがあります:
0はエクスポートモード
1はインポートモード
2はリンクモード(フルアップ日付) 機能)
ここで特に説明したいのは、IMEX パラメーターです。異なるモードは異なる読み取り動作と書き込み動作を表すためです。
IMEX=0 の場合、このモードで開かれた Excel ファイルのみが使用できます。 「書く」目的のため。
IMEX=1の場合は「インポートモード」となり、このモードで開いたExcelファイルは「読み込み」のみに使用できます。
IMEX=2の場合、このモードで開かれたExcelファイルは「読み取り」と「書き込み」の両方の目的に対応できます。
の意味は次のとおりです:
0 ---出力モード;
2 ---リンクモード (完全な更新機能)
フォロー上記の説明では、接続文字列はプラグイン


によって読み取り可能および記録可能である必要がありますが、そうではありません。 Insert Into ステートメントが実行されると、例外が発生します。「操作は更新可能オブジェクトを使用する必要があります。」

クエリ」!
これは Web アプリケーションではなく C# WinForm プログラムであることに注意してください。

Web アプリケーションの場合は、IIS_IUSRS または IIS_Service ユーザーのディレクトリ アクセス許可を追加する必要があります。

または検索してください。他の人がどのように問題を解決したかを見てみましょう。しかし、他の人の問題の解決方法を見た後、それはここでのテストに合格しません。
やはり IMEX 値に問題があるようです。1 に変更しても機能しない場合は、0 に変更してください。

ニマ、奇跡が起こりました!

その後、IMEX を 4 または 10 に設定してテストしましたが、結果は 1 と 2 を除いてすべて問題ありませんでした。これは本当に不正なリズムです。

以上がC# が oledb を使用して Excel に接続し、Insert Into ステートメントを実行する「更新可能なクエリを使用する必要がある」という問題を解決するサンプル コードです。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。