4

これは私が取り組むべき仕事のようには思えないので、この段階ではかなり愚かだと感じていますが、少し眠った後、1000の考えが私の頭の中を駆け巡り、私は今、トンネルのある鍋の中のカエルだと思います.ソリューションを曇らせるビジョンウイルス。ここに行きます:

DBMS_XMLGEN.getxml を使用して、いくつかのテーブルから XML 形式 (1 行、1 列が CLOB 型) にデータを選択する PL/SQL のクエリがあります。これは完全に機能します。

私の問題は、この XML 出力を C# に返し、この出力を自分の PC で output.xml ファイルとして保存する場所をユーザーに尋ねることです。

私はJQuery(AJAX)でASP.netを使用しているため、リンクがクリックされたときに.aspxページに投稿し、返されたデータ(このインスタンスのクエリからのxml)を使用して保存します。OLEDBデータリーダーでOLEDBコマンドを使用するのは正しい方法ではないようです...

これを行う最善の方法は何ですか?私は .net 内でシリアル化をあまり行っていませんが、これが最善の方法であると思います (私が行った調査によると)。私の状況でこれを行う方法の例はありますか?

私の考えは、基本的にこの出力/ファイルをメモリに作成し、ユーザーに保存先を尋ね、.xml ファイルとして保存し、メモリをクリアすることです。

更新: OK、クエリからの xml 出力を簡単に受け入れる XMLDocument を作成できました。このファイルを自分のPCのどこに保存するかについて、ユーザーから入力を得るにはどうすればよいですか?

これまでの私のコード:

Javascript :

function XML_ExportAppRestrictions() {
try {

    var data = {"action": "exportAppRestrictions"};

    var returned = AjaxLoad('Modules/Common/Common.aspx', null, data, null, null, false);

    if (returned.toString().toUpperCase().substring(0, 5) == "ERROR") {
        return;
    }
    else {
        // should the file be saved here or in my aspx page using xmldoc.save?
        // Using xmldoc.save will only be able to save the file on the server yes?
    }
}
    catch (ex) {
        alert(ex.Message);
    }
}

ASP:

if (Request["action"] == "exportAppRestrictions")
    {

        // Create and open DB connection
        conn.ConnectionString = SG_Common.CommonClass.NetRegUDL;
        common.OpenDBConnection(ref conn);

        // Create command and set SQL statement
        cmd.Connection = conn;
        cmd.CommandType = System.Data.CommandType.Text;
        // select text was removed below due to it's length
        cmd.CommandText = "select x as AppRestrictions from dual";

        rd = cmd.ExecuteReader();

        if (rd.HasRows)
        {
            if (rd.Read())
            {
                str = rd["AppRestrictions"].ToString();
            }
        }
        rd.Close();

        System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
        xmldoc.InnerXml = str;
        xmldoc.Save("c:\\xmltest.xml");

        goto Done;
    }

    // Done runs in a seperate try/catch statement and only returns data to the calling js function.
    Done:
        Response.Write(str);
4

2 に答える 2

1

XML は UTF8 プレーンテキストである必要があります。オブジェクトのシリアル化を使用しました。誰かが私を訂正してくれるかもしれませんが、プレーンテキストまたはバイナリデータにシリアル化を使用する必要があるとは思いませんでした。

このデータをメモリ経由で転送するために、MemoryStream とバイト バッファの使用方法を示すStackOverflow の回答がここにあります。

それをbyte[]バッファに入れることができれば、次のようなことができるからです:

public bool SaveDocument( Byte[] docbinaryarray, string docname)
{
    string strdocPath;
    strdocPath = "C:\\DocumentDirectory\\" + docname;
    FileStream objfilestream =new FileStream(strdocPath,FileMode.Create,FileAccess.ReadWrite);
    objfilestream.Write(docbinaryarray,0,docbinaryarray.Length);
    objfilestream.Close();
    return true;
}

System.IO メソッドの詳細については、こちらを参照してください。

StreamWriter writer = new StreamWriter("c:\\KBTest.txt");
writer.WriteLine("File created using StreamWriter class.");
writer.Close();
this.listbox1.Items.Clear();
addListItem("File Written to C:\\KBTest.txt");

更新 1 (Windows):

( System.Windows.Forms.SaveFileDialogを探していると思いました)

このための MSDN サンプル コードは次のとおりです。

private void button2_Click(object sender, System.EventArgs e)
{
   // Displays a SaveFileDialog so the user can save the Image
   // assigned to Button2.
   SaveFileDialog saveFileDialog1 = new SaveFileDialog();
   saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
   saveFileDialog1.Title = "Save an Image File";
   saveFileDialog1.ShowDialog();

   // If the file name is not an empty string open it for saving.
   if(saveFileDialog1.FileName != "")
   {
      // Saves the Image via a FileStream created by the OpenFile method.
      System.IO.FileStream fs = 
         (System.IO.FileStream)saveFileDialog1.OpenFile();
      // Saves the Image in the appropriate ImageFormat based upon the
      // File type selected in the dialog box.
      // NOTE that the FilterIndex property is one-based.
      switch(saveFileDialog1.FilterIndex)
      {
         case 1 : 
             this.button2.Image.Save(fs, 
            System.Drawing.Imaging.ImageFormat.Jpeg);
         break;

         case 2 : 
         this.button2.Image.Save(fs, 
         System.Drawing.Imaging.ImageFormat.Bmp);
         break;

         case 3 : 
         this.button2.Image.Save(fs, 
                System.Drawing.Imaging.ImageFormat.Gif);
         break;
      }

   fs.Close();
   }
}

そして、それが言うように、イベント ハンドラーを登録する必要があります。

this.button2.Click += new System.EventHandler(this.button2_Click);

更新 2 (ウェブ):

さて、あなたは実際に Web ソリューションを探しているようですね。私は Web ではなく Windows を考えていました。 ここでは、Web 側で行う必要があることを示します。 これは VB.NET の例ですが、翻訳できると思います。

string FileName = "Hello.doc";
string Filename = strFileName.Substring(0, FileName.LastIndexOf("."));                      
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
Response.TransmitFile(Server.MapPath("~/Folder_Name/" + FileName));
Response.End();

私はこのアプローチの変形を何度も行ってきました。XML ファイルをユーザーのブラウザに送り返しています。そこに到達したら、ユーザーはそれをどうするかを決める必要があります (多くの場合、「このファイルを開くか、保存するか」)。それはブラウザの管理下にあります。

ブラウザーに、閲覧しているファイルの種類と、それを開こうとするものを伝えるコンテンツ タイプ ヘッダーを含めることで、ブラウザーを支援できます。したがって、このヘッダーは Excel を呼び出すように要求します。

Response.AppendHeader("Content-Type", "application/vnd.ms-excel");

多くの場合、application/pdf が表示されます。これは、Adobe Reader またはユーザーが使用しているその他の PDF リーダーを表示します。ここでは、コンテンツ タイプ「text/xml」を使用します。ここでは、ユーザーがアプリケーションでファイルを開くのではなく、ファイルを保存することを意図しているため、コンテンツ タイプはあまり重要ではありません。

コンテンツ配置の「添付」と「インライン」には少し問題があります。両方の方法を試して、どちらがより適切に動作するかを確認してください。そのうちの 1 つ (どれか思い出せません) は、基本的に、送信しようとしている提案されたファイル名を無視し、代わりに ASP ページの名前を使用します。とてもうるさい。Firefox は少なくともこれをバグとして文書化していますが、IE はこれを別の「機能」と見なしているようです。

于 2013-03-14T14:14:19.390 に答える
0

Jquery (AJAX) を使用すると、ユーザー インタラクションに関して制限があります (保存ダイアログ ボックスへの特定の参照 - つまり、私の例では asp ページに要求を送信し、ファイル [または私の場合はメモリ ストリーム] が返されることを期待しています)。ユーザーにどこに保存したいか尋ねたい-したがって、サーバー上ではありません)。

Web関連の呼び出しにAJAXを使用することが私の得意であるため、これに対する回避策を見つけました。この投稿で述べたように改善の余地がありますが、私にとっては完璧に機能したため、response.write (x) を使用して XML データを返すことができ、この「ハック」により、ユーザーは XML ファイルを好きな場所に保存できます。 :

Javascript ソース:

jQuery.download = function (url, data, method) {
//url and data options required
if (url && data) {
    //data can be string of parameters or array/object
    data = typeof data == 'string' ? data : jQuery.param(data);
    //split params into form inputs
    var inputs = '';
    jQuery.each(data.split('&'), function () {
        var pair = this.split('=');
        inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
    });
    //send request
    jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>')
    .appendTo('body').submit().remove();
};
};

ASPリターン:

Response.Clear();
Response.ContentType = "text/xml";
Response.AddHeader("Content-disposition", "attachment; filename=test.xml");
Response.Write(yourXMLstring);

使用例 (javascript 呼び出し):

$.download("your_url_here", html_url_based_parameters_if_needed_here);

ここでこの役立つ投稿を入手しました:http://www.filamentgroup.com/lab/jquery_plugin_for_requesting_ajax_like_file_downloads/

これが将来誰かに役立つことを願っています!

于 2013-03-18T10:25:49.510 に答える