2010年7月4日 星期日

SqlBulkCopy 有效率地將其他來源的資料大量載入 SQL Server 資料表

引用來源

string connectionString = GetConnectionString();

using (SqlConnection sourceConnection = new SqlConnection(connectionString))
{
sourceConnection.Open();

//Perform an initial count on the destination table.
SqlCommand commandRowCount = new SqlCommand( "SELECT COUNT(*) FROM " + "dbo.BulkCopyDemoMatchingColumns;", sourceConnection);
long countStart = System.Convert.ToInt32( commandRowCount.ExecuteScalar());

// Get data from the source table as a SqlDataReader.
SqlCommand commandSourceData = new SqlCommand("SELECT ProductID, Name, " + "ProductNumber " + "FROM Production.Product;", sourceConnection);
SqlDataReader reader = commandSourceData.ExecuteReader();

// Open the destination connection. In the real world you would
// not use SqlBulkCopy to move data from one table to the other
// in the same database. This is for demonstration purposes only.
using (SqlConnection destinationConnection = new SqlConnection(connectionString))
{
destinationConnection.Open();

// Set up the bulk copy object.
// Note that the column positions in the source
// data reader match the column positions in
// the destination table so there is no need to
// map columns.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName = "dbo.BulkCopyDemoMatchingColumns";

try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{

}
finally
{
// Close the SqlDataReader. The SqlBulkCopy
// object is automatically closed at the end
// of the using block.
reader.Close();
}
}

// Perform a final count on the destination
// table to see how many rows were added.
long countEnd = System.Convert.ToInt32(commandRowCount.ExecuteScalar());

}
}

SqlBulkCopy 物件來大量複製文字檔

聲明:這篇文章是別人的
相關請參考原出處
本篇重點在利用文字檔 "," 分隔判段{為標準sql text 格式檔};所以可以用此法
底下就看看原作者(章立民{高手-曾是foxpro後轉net})的寫法:
----------------------------------------------------------------------------
Option Strict On

' 匯入命名空間。
Imports Microsoft.VisualBasic.FileIO
Imports System.Data.SqlTypes
Imports System.Data.SqlClient

Public Class Form1

Private currentRow As String()
Private myRowCount As Integer = 1
Private myBatchCount As Integer = 1
Private myCopiedRows As Long = 0
Private countStart As Long

' 建立「章立民研究室」資料表,此處是當作一個中介資料表來使用。
Private myTable As New DataTable("章立民工作室")

Private Sub btnParseTextFiles_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGoBulkCopy.Click

Me.btnGoBulkCopy.Enabled = False

' 建立「員工編號」欄位。
Dim colEmployeeId As DataColumn = _
myTable.Columns.Add("員工編號", Type.GetType("System.Int32"))

' 建立「身份證字號」欄位。
myTable.Columns.Add("身份證字號", Type.GetType("System.String"))
myTable.Columns("身份證字號").MaxLength = 10
myTable.Columns("身份證字號").AllowDBNull = False

' 建立「姓名」欄位。
myTable.Columns.Add("姓名", Type.GetType("System.String"))
myTable.Columns("姓名").MaxLength = 12

' 建立「性別」欄位。
myTable.Columns.Add("性別", Type.GetType("System.String"))
'myTable.Columns("性別").MaxLength = 1

' 建立「地址」欄位。
myTable.Columns.Add("地址", Type.GetType("System.String"))
myTable.Columns("地址").MaxLength = 41

' 建立「郵遞區號」欄位。
myTable.Columns.Add("郵遞區號", Type.GetType("System.String"))
myTable.Columns("郵遞區號").MaxLength = 5

' 建立「出生日期」欄位。
myTable.Columns.Add("出生日期", Type.GetType("System.DateTime"))

' 建立「婚姻狀況」欄位。
myTable.Columns.Add("婚姻狀況", Type.GetType("System.String"))

' 建立「雇用日期」欄位。
myTable.Columns.Add("雇用日期", Type.GetType("System.DateTime"))

' 建立「起薪」欄位。
myTable.Columns.Add("起薪", Type.GetType("System.Double"))

' 建立「目前薪資」欄位。
myTable.Columns.Add("目前薪資", Type.GetType("System.Double"))

' 建立「加薪日期」欄位。
myTable.Columns.Add("加薪日期", Type.GetType("System.DateTime"))

' 建立「部門」欄位。
myTable.Columns.Add("部門", Type.GetType("System.String"))
myTable.Columns("部門").MaxLength = 10

Using myReader As New TextFieldParser("Text章立民工作室.txt")

' 表示檔案內容是字元分隔。
myReader.TextFieldType = FieldType.Delimited

' 定義文字檔的字元分隔符號。
myReader.Delimiters = New String() {","}

' 循環處理文字檔中所有資料列的所有欄位。
While Not myReader.EndOfData

Try
currentRow = myReader.ReadFields()

' 略過標題列
If myRowCount > 1 Then
myTable.Rows.Add(currentRow)
End If
Catch ex As MalformedLineException
MessageBox.Show(ex.Message)
Exit Sub
End Try

myRowCount += 1
Me.lblBeingCopyedTextRows.Text = myTable.Rows.Count.ToString
Me.lblBeingCopyedTextRows.Refresh()

If myTable.Rows.Count = 50000 Then
Try
GoBulkCopy()
Catch ex As Exception
MessageBox.Show(ex.Message)
Exit Sub
End Try
' 清空資料表。
myTable.Rows.Clear()
myBatchCount += 1
End If
End While

' 複製最後一批不足50000 筆的資料記錄。
If myTable.Rows.Count > 0 Then
GoBulkCopy()
End If
End Using

Me.lblBeingCopyedTextRows.Text = myTable.Rows.Count.ToString
Me.lblTextFileRowCount.Text = _
"來源文字檔的資料筆數:" & (myRowCount - 2).ToString
Me.btnGoBulkCopy.Enabled = True
End Sub

Private Sub GoBulkCopy()
' 利用SqlConnectionStringBuilder 物件來構建連接字串。
' 由於本範例是在同一個SQL Server 資料庫的不同資料表之間進行大量複製作業,
' 因此連接至來源資料庫與連接至目標伺服器的連接字串是相同的。
Dim sqlconStringBuilder As New SqlConnectionStringBuilder()
sqlconStringBuilder.DataSource = "(local)SQLExpress"
sqlconStringBuilder.InitialCatalog = "北風貿易"
sqlconStringBuilder.IntegratedSecurity = True

' 建立連結至目標SQL Server 資料庫的連接。
Using con_bulkcopy As New _


SqlConnection(sqlconStringBuilder.ConnectionString)

' 開啟連接至目標SQL Server 的連接。
con_bulkcopy.Open()

Dim cmdRowCount As New SqlCommand( _
"SELECT COUNT(*) FROM dbo.Bulk_Target_章立民工作室;", _
con_bulkcopy)

If myBatchCount = 1 Then
' 計算出目標資料表在執行大量複製作業前有多少筆資料記錄。
countStart = System.Convert.ToInt32(cmdRowCount.ExecuteScalar())
Me.lblRowsCountBeforeBulkCopy.Text = _
"目標資料表在大量複製前擁有的資料筆數= " & countStart.ToString
Me.lblRowsCountBeforeBulkCopy.Refresh()
End If

' 建立一個SqlBulkCopy 物件以便執行大量複製作業。
Using bcp As SqlBulkCopy = New SqlBulkCopy(con_bulkcopy)

' 指定目標資料表的名稱。
bcp.DestinationTableName = "dbo.Bulk_Target_章立民工作室"

' 如果來源資料表與目標資料表的各個欄位順序沒有完全對應,
' 必須在此設定來源欄位與目標欄位的對應關係。

' 將來源資料寫入目標資料表。
bcp.WriteToServer(myTable)

End Using

' 最後再計算出大量複製了多少筆資料記錄。
Dim countEnd As Long = _
System.Convert.ToInt32(cmdRowCount.ExecuteScalar())

' 計算出累計複製筆數。
myCopiedRows = countEnd – countStart

' 顯示出批次與大量複製累計筆數。
Me.DataGridView1.Rows.Add( _
New String() {CStr(myBatchCount), CStr(myCopiedRows)})
Me.DataGridView1.Refresh()

End Using
End Sub
End Class

用sqlbulkcopy大量寫入結合交易檔

聲明:本篇是別人文章
相關請參考原出處
續引一篇進來,主要寫法不大一樣;多了(丟出事件)和(交易)這兩個動作
(1)
//處理完後丟出一個事件,或是說處理幾筆後就丟出事件
mySbc.NotifyAfter = sourceDt.Rows.Count;
mySbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(mySbc_SqlRowsCopied);
(2)
//完成交易
myScope.Complete();
-------------------------------------------------------
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Transactions;

public partial class test_sqlBulkCopy : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
//產生source table
DataTable sourceDt = new DataTable();
sourceDt.Columns.Add("id", typeof(int));
sourceDt.Columns.Add("a", typeof(string));
sourceDt.Columns.Add("b", typeof(string));
sourceDt.Columns.Add("c", typeof(string));

//看你要產生幾筆row先寫在datatable
for (int i = 0; i < 10; i++)
{
DataRow dr = sourceDt.NewRow();
dr["a"] = "a" + i.ToString();
dr["b"] = "b" + i.ToString();
dr["c"] = "c" + i.ToString();
sourceDt.Rows.Add(dr);
}

//加入2.0以後的交易,記得匯入System.Transactions.dll
using (TransactionScope myScope = new TransactionScope())
{
//大量寫入
using (SqlConnection myConn = new SqlConnection(ConfigurationManager.
ConnectionStrings["NORTHWNDConnectionString"].ConnectionString))
{
myConn.Open();

using (SqlBulkCopy mySbc = new SqlBulkCopy(myConn))
{
//設定
mySbc.BatchSize = 1000;
mySbc.BulkCopyTimeout = 60;

//處理完後丟出一個事件,或是說處理幾筆後就丟出事件
mySbc.NotifyAfter = sourceDt.Rows.Count;
mySbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(mySbc_SqlRowsCopied);

//更新哪個資料庫
mySbc.DestinationTableName = "dbo.test";

//column對應
mySbc.ColumnMappings.Add("id", "id");
mySbc.ColumnMappings.Add("a", "a");
mySbc.ColumnMappings.Add("b", "b");
mySbc.ColumnMappings.Add("c", "c");

//寫入
mySbc.WriteToServer(sourceDt);
//throw new Exception("error");

//完成交易
myScope.Complete();
}
}
}
}

void mySbc_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
ClientScript.RegisterStartupScript(GetType(), "test", "alert('完成');", true);
}

protected void Button2_Click(object sender, EventArgs e)
{
//刪除測試資料
linqToSqlDataContext db = new linqToSqlDataContext();
db.ExecuteCommand("DELETE FROM test");
ClientScript.RegisterStartupScript(GetType(), "test", "alert('完成');", true);
}
}

使用SqlBulkCopy將資料批次寫入資料庫

聲明:本篇為別人的文章
相關請參考原出處
會引用來此,因怕自己要參考;又要g一次,只好先記錄下來了!!
-------------------------------------------------------------
//一開始我們先產生一個DataTable來裝我們要寫入的資料
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));

//因為SqlBulkCopy的猛就是大量的一次寫入,所以我們也來跑10萬筆吧
int i;
for (i = 0; i < 100000; i++)
{
DataRow dr = dt.NewRow();
dr["name"] = i.ToString();
dt.Rows.Add(dr);
}

//宣告連結字串
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ASPNETDBConnectionString1"].ConnectionString);

conn.Open();
//宣告SqlBulkCopy
using (SqlBulkCopy sqlBC = new SqlBulkCopy(conn))
{
//設定一個批次量寫入多少筆資料
sqlBC.BatchSize = 1000;
//設定逾時的秒數
sqlBC.BulkCopyTimeout = 60;

//設定 NotifyAfter 屬性,以便在每複製 10000 個資料列至資料表後,呼叫事件處理常式。
sqlBC.NotifyAfter = 10000;
sqlBC.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);

//設定要寫入的資料庫
sqlBC.DestinationTableName = "dbo.Table1";

//對應資料行
sqlBC.ColumnMappings.Add("id", "id");
sqlBC.ColumnMappings.Add("name", "name");

//開始寫入
sqlBC.WriteToServer(dt);
}
conn.Dispose();
}
void OnSqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
Response.Write("---
");
}

2010年7月3日 星期六

稅別:內含,外加 計算

在開發進貨流程當中,就會遇到廠商稅別的這問題!
內含稅,外加稅,免稅,零稅
在網路上g了好久,總算找到一個計算公式;真是的,稅計算-國稅局都不會用簡單一點嗎? 讓google能輕易g到啊
不然要人家開發的,還要先去找會計師問? 浪費時間(發牢騷嗯~)

底下為內含稅,外加稅的計算公式:
價內稅:稅款=含稅價格*稅率
價外稅:稅款=(含稅價格/(1+稅率))*稅率=不含稅價格*稅率
因為增值稅是價外稅,所以應繳增值稅=含稅價格/(1+稅率))*稅率=不含稅價格*稅率

至於免稅,零稅的話;就不用再處理了
-----
另外底下一些片段,都是各處網站搜集到的;留下來自己要參考用的

Option Compare Database

Private Sub Form_AfterUpdate()
Call CountTax
End Sub

Public Function CountTax()
Select Case Application.Forms("frm進貨作業")![稅別]
Case "應稅"
Application.Forms("frm進貨作業")![未稅價] = Val(Application.Forms("frm進貨作業").Controls("Child12").Form.合計 & "")
Application.Forms("frm進貨作業")![稅額] = Val(Application.Forms("frm進貨作業")![未稅價]) * 0.05
Application.Forms("frm進貨作業")![含稅總價] = Val(Application.Forms("frm進貨作業")![未稅價]) * 1.05

Case "免稅"
Application.Forms("frm進貨作業")![未稅價] = Val(Application.Forms("frm進貨作業").Controls("Child12").Form.合計 & "")
Application.Forms("frm進貨作業")![稅額] = 0
Application.Forms("frm進貨作業")![含稅總價] = Application.Forms("frm進貨作業")![未稅價]

End Select
End Function

AR系統中每一筆應收帳款有明細金額與總金額
其中每一項明細金額與總額都有三個欄位﹕未稅金額﹑稅額﹑含稅金額

依據稅別的性質(內含稅 or 外加稅)﹐AR總額的計算邏輯有不同
1.內含稅﹕則加總各項明細含稅金額計算總含稅金額﹐再反除稅率計算總未稅金額﹔
2.外加稅﹕則加總各項明細未稅金額﹐再乘以稅率計算總稅額及含稅金額



預交日: 某種訂單的預計交貨日期,如果超過了預計交貨日期,系統會自動進行應交未交貨品的報警訊息。
品號、品名、規格:是指貨品的具體描述。
庫位:指存放某種貨品的地方,可以按倉庫設置,也可以按照明細格子進行設置,以便貨品的存放。
單價: 貨品的採購或銷售單價。
數量: 某種業務單據所涉及的貨品的數量。
金額: 單價×數量。
未稅金額:不含稅的金額。
稅金:金額-未稅金額。

2010年7月2日 星期五

指定截取字串長度

底下取法,中文字=2 byte ;若不用這樣,必須寫很長的for , if , asc 的判斷
Dim str As String = "AB12字3DD串abcjdj124你好"
str = Encoding.Default.GetString(Encoding.Default.GetBytes(str), 0, 13)

讀取mht檔



code:
Imports System.Text.Encoding
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim streamReader As New IO.StreamReader("C:\22.mht")
Dim str As String = streamReader.ReadToEnd()
Me.WebBrowser1.DocumentText = str
End Sub
End Class

2010年7月1日 星期四

租書軟體



更換系統,目前支援他套軟體資料庫轉檔列表:
(01)普克DOS系統
(02)快樂租書WIN系統
(03)威志租書WIN系統/第1版
(04)哈書族WIN(MDB)系統
(05)普克WIN系統
(06)皇冠WIN(GDB)系統
(07)哈書族WIN(GDB)系統
(08)二微碼WIN(DBF)系統
(09)壹品DOS(萬卷)(DBF)系統
(10)小太陽DOS(DBF)系統
(11)八分伴DOS/DVD(DBF)系統||2011/1/25
(12)威林WIN系統
(13)快手三號DOS(DBF)||2011/4/6
(14)展燕庭-翰昇租書WIN系統||2011/8/28

免費服務支援:
1.新書上傳
2.新書下傳
3.書籍資料遠端引用,近端引用
4.合理的建議功能
5.諮詢維護
6.永久免費更新

好大問題,不可不知:
1.您正在使用的軟體失去維護的技術部門了嗎?
2.您正在使用的軟體開始要收服務費用嗎?
3.當初為了便宜所以買了他套租書軟體,可是每年還要繳費用啊?
4.為什麼我的軟體有問題,反應都沒用呢;就是不更新,更換新版要錢?
5.有問題,每次打去問都說很忙;沒下文了?
6.一路使用下來,問題還是在啊;每次交班會當機,資料會不見?

有些軟體標榜了很多好處,好多強的地方;以上6問題是否在您身上發生了!?

歡迎有勇氣再換軟體的店家,請你一定要試試本工作室這套租書軟體;過去煩惱包都沒了!!

要嗎? 試嗎? 先探探風評,好的不怕你考驗! 就怕你貪小便宜啦!