2011年12月14日 星期三

Crystal Report常用程式碼段


//列印份數屬性
 printerSettings.Copies = 2;
//橫印
printerSettings.DefaultPageSettings.Landscape = true;


//設定印表紙張為A5
System.Drawing.Printing.PrintDocument PDSize = new System.Drawing.Printing.PrintDocument();
  for (int i = 0; i < PDSize.PrinterSettings.PaperSizes.Count; i++)
  {
      if (PDSize.PrinterSettings.PaperSizes[i].PaperName=="A5")
      {
          System.Drawing.Printing.PaperSize size = PDSize.PrinterSettings.PaperSizes[i];
          //選紙張A5
          printerSettings.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("Paper", size.Width, size.Height);
      }
  }


//完整印表範例
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;

namespace CrystalReportsApplication1
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        //Crystal Report for VS2010 Viewer 測試
        private void button1_Click(object sender, EventArgs e)
        {
            // ReportPreview1是CrystalReport1.rpt報表檔的預覽畫面
            ReportPreview1 rv1 = new ReportPreview1();
            rv1.Show();
        }

        //Crystal Report for VS2010 直接列印二份報表到預設印表機測試
        private void button2_Click(object sender, EventArgs e)
        {
            CrystalReport1 report1 = new CrystalReport1();
            report1.PrintToPrinter(2, false, 0, 0);
        }

        //Crystal Report for VS2010 選擇印表機後列印測試
        private void button3_Click(object sender, EventArgs e)
        {
            CrystalReport1 report1 = new CrystalReport1();
            PrinterSettings printerSettings = new PrinterSettings();
            PrintDialog printDialog = new PrintDialog();
            printDialog.PrinterSettings = printerSettings;
            printDialog.AllowPrintToFile = false;
            printDialog.AllowSomePages = true;
            printDialog.UseEXDialog = true;
            //顯示Print Dialog讓User挑選印表機
            DialogResult result = printDialog.ShowDialog();
            if (result == DialogResult.Cancel)
            {
                return;
            }
            //設定印表機後, 印出報表
            report1.PrintOptions.PrinterName = printerSettings.PrinterName;
            report1.PrintToPrinter(printerSettings.Copies, false, 0, 0);
        }
    }
}

---
Welly Lin

2011年12月2日 星期五

ADO.NET Command 及 DataReader 配合 DB Server Stored Procedure 作法


Q : 如何取得資料表的記錄總筆數,並傳回資料表記錄內容?

--------------------------
如果你想要取得DataReader,又要馬上知道所有的列數,
建議你可以利用Stored Procedure的方式達成。

以下為範例:

Create PROCEDURE MyJob_sp_ReturnMyData
(
@UserName varchar(20),
@TotalRecs int output
)
AS
  Select * From MyTableName Where UserName = @UserName
  Select @TotalRecs = Count(0) From MyTaleName Where UserName = @UserName


然後我們在前端可以這樣做:

//建立Command物件
OleDbCommand cmd = new ("MyJob_sp_ReturnMyData", DBConnstr);
cmd.CommandType = CommandType.StoredProcedure; // 這邊請注意要設定

//加入參數
OleDbParameter paUserName = new OleDbParameter("@UserName", OleDbType.VarChar, 20);
OleDbParameter paTotalCount = new OleDbParameter("@TotalRecs" , OleDbType.integer);
paTotalCount.Direction = ParameterDirection.Output; //這邊請注意要設定
paUserName.Value = "David";

cmd.Parameters.Add(paUserName);
cmd.Parameters.Add(paTotalCount);

//執行

int TotalCount = 0;
try
{
    OleDbDataReader dr = cmd.ExecuteRader();
    TotalCount = paTotalCount.Value; //取得輸出的列數
}
catch
{
    // do something
}
finally
{
    //do something like closing conntion and datareader
}

--------------------------
或者  全改用 DataReader 在前端處理:
因為 DataReader 是順向游標 , 無法回到最前面 .
你要把 DataReader 關掉再 ExecuteReader() 一次 .

以下是我的程式內容,需ExecuteReader()兩次,Close()兩次,
第一次取得筆數,第二次將資料(書本名稱)傳入字串陣列

     '取得所有書名資料'
     Dim myReader As SqlDataReader = sqlCmd.ExecuteReader()

     '取得所有列數'
     Dim i As Integer = 0
     While myReader.Read()
     i += 1
     End While
     myReader.Close()

     '將資料(書本名稱)傳入字串陣列'
     myReader = sqlCmd.ExecuteReader()
     Dim jj(i - 1) As String
     i = 0

     While myReader.Read()
     jj(i) = myReader.GetString(1)
     i += 1
     End While

     myReader.Close()
     sqlCN.Close()

--------------------------

節錄來源:http://www.programmer-club.com.tw/showSameTitleN/aspdotnet/9608.html