2020年12月29日 星期二

sql server中批量插入與更新兩種解決方案分享

 sql server中批量插入與更新兩種解決方案分享


若只是需要大批量插入資料使用bcp是最好的,若同時需要插入、刪除、更新建議使用SqlDataAdapter我測試過有很高的效率,一般情況下這兩種就滿足需求了

bcp方式

複製程式碼 程式碼如下:

/// <summary>

/// 大批量插入資料(2000每批次)

/// 已採用整體事物控制

/// </summary>

/// <param name=”connString”>資料庫連結字串</param>

/// <param name=”tableName”>資料庫伺服器上目標表名</param>

/// <param name=”dt”>含有和目標資料庫表結構完全一致(所包含的欄位名完全一致即可)的DataTable</param>

public static void BulkCopy(string connString, string tableName, DataTable dt)

{

using (SqlConnection conn = new SqlConnection(connString))

{

conn.Open();

using (SqlTransaction transaction = conn.BeginTransaction())

{

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, transaction))

{

bulkCopy.BatchSize = 2000;

bulkCopy.BulkCopyTimeout = _CommandTimeOut;

bulkCopy.DestinationTableName = tableName;

try

{

foreach (DataColumn col in dt.Columns)

{

bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);

}

bulkCopy.WriteToServer(dt);

transaction.Commit();

}

catch (Exception ex)

{

transaction.Rollback();

throw ex;

}

finally

{

conn.Close();

}

}

}

}

}


SqlDataAdapter

複製程式碼 程式碼如下:

/// <summary>

/// 批量更新資料(每批次5000)

/// </summary>

/// <param name=”connString”>資料庫連結字串</param>

/// <param name=”table”></param>

public static void Update(string connString, DataTable table)

{

SqlConnection conn = new SqlConnection(connString);

SqlCommand comm = conn.CreateCommand();

comm.CommandTimeout = _CommandTimeOut;

comm.CommandType = CommandType.Text;

SqlDataAdapter adapter = new SqlDataAdapter(comm);

SqlCommandBuilder commandBulider = new SqlCommandBuilder(adapter);

commandBulider.ConflictOption = ConflictOption.OverwriteChanges;

try

{

conn.Open();

//設定批量更新的每次處理條數

adapter.UpdateBatchSize = 5000;

adapter.SelectCommand.Transaction = conn.BeginTransaction();/////////////////開始事務

if (table.ExtendedProperties[“SQL”] != null)

{

adapter.SelectCommand.CommandText = table.ExtendedProperties[“SQL”].ToString();

}

adapter.Update(table);

adapter.SelectCommand.Transaction.Commit();/////提交事務

}

catch (Exception ex)

{

if (adapter.SelectCommand != null && adapter.SelectCommand.Transaction != null)

{

adapter.SelectCommand.Transaction.Rollback();

}

throw ex;

}

finally

{

conn.Close();

conn.Dispose();

}

}

2020年12月28日 星期一

C# DataTable 分頁處理

 #1

DataTable dt=GetDataTable();

Int pageSize=5000;

int count =dt.Rows.Count/pageSize;

for(int i=0;i<=count;i++)

{

        DataTable dtNew=dt.AsEnumerable().Skip(i * pageSize).Take(pageSize).CopyToDataTable();


}


#2

public DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)//PageIndex表示第幾頁,PageSize表示每頁的記錄數

  {

   if (PageIndex == 0)

    return dt;//0頁代表每頁數據,直接返回


   DataTable newdt = dt.Copy();

   newdt.Clear();//copy dt的框架


   int rowbegin = (PageIndex - 1) * PageSize;

   int rowend = PageIndex * PageSize;


   if (rowbegin >= dt.Rows.Count)

    return newdt;//源數據記錄數小於等於要顯示的記錄,直接返回dt


   if (rowend > dt.Rows.Count)

    rowend = dt.Rows.Count;

   for (int i = rowbegin; i <= rowend - 1; i++)

   {

    DataRow newdr = newdt.NewRow();

    DataRow dr = dt.Rows[i];

    foreach (DataColumn column in dt.Columns)

    {

     newdr[column.ColumnName] = dr[column.ColumnName];

    }

    newdt.Rows.Add(newdr);

   }

   return newdt;

  }


2020年12月14日 星期一

Get column index from datagridview cell on mousedown or mouse enter event

 Private clickedCell As DataGridViewCell


Private Sub dataGridView1_MouseDown(ByVal sender As Object, _

    ByVal e As MouseEventArgs) Handles dataGridView1.MouseDown


    ' If the user right-clicks a cell, store it for use by the 

    ' shortcut menu.

    If e.Button = MouseButtons.Right Then

        Dim hit As DataGridView.HitTestInfo = _

            dataGridView1.HitTest(e.X, e.Y)

        If hit.Type = DataGridViewHitTestType.Cell Then

            clickedCell = _

                dataGridView1.Rows(hit.RowIndex).Cells(hit.ColumnIndex)

        End If

    End If


End Sub

Jquery ajax載入等待執行結束再繼續執行下面程式碼操作

 Jquery ajax載入等待執行結束再繼續執行下面程式碼操作

--

不錯的方法

2020年8月21日 星期五

2020年7月29日 星期三

判断字符是否为中文

判断字符是否为中文

1、用ASCII码判断

在 ASCII码表中,英文的范围是0-127,而汉字则是大于127,具体代码如下:

代码如下:

string text = "是不是汉字,ABC,柯乐义";
       for (int i = 0; i < text.Length; i++)
       {
            if ((int)text[i] > 127)
                  Console.WriteLine("是汉字");
            else
                  Console.WriteLine("不是汉字");
       }
 

 

2、用汉字的 UNICODE 编码范围判断

汉字的UNICODE编码范围是4e00-9fbb,具体代码如下:

 代码如下:

string text = "是不是汉字,ABC,keleyi.com";
      char[] c = text.ToCharArray();
 

       for (int i = 0; i < c.Length;i++)
       if (c[i] >= 0x4e00 && c[i] <= 0x9fbb)
              Console.WriteLine("是汉字");
       else
              Console.WriteLine("不是汉字");

 

 

3、用正则表达式判断

用正则表达式判断也是用汉字的 UNICODE 编码范围,具体代码如下:

代码如下:

string text = "是不是汉字,ABC,keleyi.com";
        for (int i = 0; i < text.Length; i++)
        {
               if (Regex.IsMatch(text[i].ToString(), @"[\u4e00-\u9fbb]+{1}quot;))
                   Console.WriteLine("是汉字");
               else
                   Console.WriteLine("不是汉字");
        }

winform中如何取得 DataGridView 单元格的屏幕位置

winform中如何取得 DataGridView 单元格的屏幕位置
首先取得DataGridView的坐标位置:
int dgvX = dataGridView1.Location.X;
int dgvY = dataGridView1.Location.Y;
然后取得选中单元格的坐标在DataGridView中的坐标位置:
int cellX = dataGridView1.GetCellDisplayRectangle(ColumnIndex,RowIndex,false).X;
int cellY = dataGridView1.GetCellDisplayRectangle(ColumnIndex,RowIndex,false).Y;
最后可以得到每个单元格相对于form的坐标为:
int x = dgvX + cellX;
int y = dgvY + cellY;

//点击单元格获取单元格位置并显示控件A.png

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 && e.ColumnIndex > 4)
            {
                int dgvX = dataGridView1.Location.X;
                int dgvY = dataGridView1.Location.Y;
                int cellX = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false).X;
                int cellY = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false).Y;
                int x = dgvX + cellX;
                int y = dgvY + cellY;
                dateTimePicker1.Location =  new Point(x,y);
                dateTimePicker1.Visible = true;
            }
        }

2020年6月30日 星期二

Web RWD APP 代購系統 #3

換寫到後台訂單作業了
有點麻煩,因採用一對多檔模式;在aspnet上的呈現無法像windows app 那樣直覺式,想來想去就是採用2層式來處理:主檔+明細+付款
(未來結構會綁定更多的應用區塊,等有空再貼上來了)


2020年6月28日 星期日

Using GridView's EmptyDataTemplate to insert new row

參考來源:Using GridView's EmptyDataTemplate to insert new row
--
精華段:
Sub ButtonEmptyInsert_Click(ByVal sender As Object, ByVal e As EventArgs)
        ' Insert new record
        Dim RowIndex As Integer = DirectCast(DirectCast(sender, Control).NamingContainer, GridViewRow).RowIndex
        Dim misship_id As DropDownList = TryCast(GridViewDetails.Rows(RowIndex).FindControl("DropListMisShipIDEmpty"), DropDownList)
        Dim code_id As DropDownList = TryCast(GridViewDetails.Rows(RowIndex).FindControl("DropListCodeEmpty"), DropDownList)
        Dim upc As TextBox = TryCast(GridViewDetails.Rows(RowIndex).FindControl("txtUPC"), TextBox)
        Dim description As TextBox = TryCast(GridViewDetails.Rows(RowIndex).FindControl("txtDescription"), TextBox)
        Dim qty_ordered As TextBox = TryCast(GridViewDetails.Rows(RowIndex).FindControl("txtQtyOrdered"), TextBox)
        Dim qty_received As TextBox = TryCast(GridViewDetails.Rows(RowIndex).FindControl("txtQtyReceived"), TextBox)
        Dim cost As TextBox = TryCast(GridViewDetails.Rows(RowIndex).FindControl("txtCost"), TextBox)
        Dim adjust_amount As TextBox = TryCast(GridViewDetails.Rows(RowIndex).FindControl("txtAdjAmt"), TextBox)
        Dim status As DropDownList = TryCast(GridViewDetails.Rows(RowIndex).FindControl("DropListStatusEmpty"), DropDownList)
        Dim status_quantity As TextBox = TryCast(GridViewDetails.Rows(RowIndex).FindControl("txtStatusQty"), TextBox)
        SourceMisShipDetails.InsertParameters("misship_id").DefaultValue = misship_id.SelectedValue
        SourceMisShipDetails.InsertParameters("code_id").DefaultValue = code_id.SelectedValue
        SourceMisShipDetails.InsertParameters("upc").DefaultValue = upc.Text
        SourceMisShipDetails.InsertParameters("description").DefaultValue = description.Text
        SourceMisShipDetails.InsertParameters("qty_ordered").DefaultValue = qty_ordered.Text
        SourceMisShipDetails.InsertParameters("qty_received").DefaultValue = qty_received.Text
        SourceMisShipDetails.InsertParameters("cost").DefaultValue = cost.Text
        SourceMisShipDetails.InsertParameters("adjust_amount").DefaultValue = adjust_amount.Text
        SourceMisShipDetails.InsertParameters("status").DefaultValue = status.SelectedValue
        SourceMisShipDetails.InsertParameters("status_quantity").DefaultValue = status_quantity.Text
        SourceMisShipDetails.Insert()
    End Sub

2020年6月27日 星期六

從RowCommand上的嵌套GridView中的DropDownList中檢索值

從RowCommand上的嵌套GridView中的DropDownList中檢索值
--
底下這段真是精華

// Calls when Inner GridView 's button clicked
protected void GridView_Inner_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // get Inner GridView 's clicked row
    GridViewRow InnerGridViewRow = (GridViewRow)(((Control)e.CommandSource).NamingContainer);

    // get Inner GridView 's controls from clicked row
    TextBox TextBox_Inner = (TextBox)InnerGridViewRow.FindControl("TextBox_Inner");
    DropDownList DropDownList_Inner = (DropDownList)InnerGridViewRow.FindControl("DropDownList_Inner");

    // check if correct button is clicked
    if (e.CommandName == "BtnInnerCmd")
    {
        string DropDownListValue = DropDownList_Inner.SelectedValue;
        string TextBoxValue = TextBox_Inner.Text;

        Label_Result.Text = "DropDownList 's Selected Value is " + DropDownListValue +
                            "
TextBox 's Entered Value is " + TextBoxValue;
    }
}

2020年6月18日 星期四

crystal report 控制字體大小

1.請利用 CrystalReports 公式去判斷字數再去變更其字體大小
2.在欄位上右鍵 --> 格式物件 --> 字型(標籤) --> 大小 ,編輯其公式
3.參考以下公式
if length({@欄位名稱}) > 15 then 9 else 12

2020年5月29日 星期五

Windows 10 SSD 校能調整

最近把SATA HD 改SSD ,發現使用一段時間就變得超級慢
只好來看看怎回事了
改善寫入速度效能,以避免系統凍結
Inetl 這有一篇,調整的方法!!
目前我的調整共2個:
1.關閉 HD 的寫入快取
2.關閉 C: D: 的建立索引
完成後,請關機;再開機!  就有明顯的差異了
---
後續也是要在觀察看看了!
底下為參考圖

 

2020年5月28日 星期四

Web RWD APP 代購系統 #2

會員登入畫面搞定了,再來就是嵌入三竹簡訊API和後端處理機制了
--



2020年5月27日 星期三

Web RWD APP 代購系統 #1

這案子總算定版,確定版型了
客戶在月初急著要,也沒給樣板參考;到底要製作怎樣的樣式
弄得,我只好先初草版;一出~就開始有靈感.....延伸一堆新想法
這樣耗了2週,現這樣式總算是確定了
(接Web RWD APP 真的要心理準備,初版一定被全改的準備.....)
---

2020年5月4日 星期一

2020年最新鉅作-服裝租借系統+電子發票#5

系統總算趕工完成了!
底下貼出來的是目前客戶端提出的統計分析項,現不多項;等以後客戶提出,再慢慢加了
服裝租借系統+電子發票;就到此初步完成! 後續就是封裝和讓客戶測試進行微調的工作了
接下又將展開新案件了...






2020年4月24日 星期五

如何讓DataGridView每筆Row呈現不同的Cell Type

參考來源: [C#]如何讓DataGridView每筆Row呈現不同的Cell Type
--
C#
{
    //如果是點在Value欄位的話才出現
    if (e.ColumnIndex == 1)
    {
        DataGridViewRow tNowRow = dataGridView1.Rows[dataGridView1.CurrentRow.Index];

        if (tNowRow.Cells["Type"].Value != null)
        {
            if (tNowRow.Cells["Type"].Value != null)
            {
                //如果是bool的話就變成CheckBox
                if (tNowRow.Cells["Type"].Value.ToString() == "bool")
                {
                    dataGridView1["Value", dataGridView1.CurrentRow.Index] = new DataGridViewCheckBoxCell();
                }
                //如果是combo的話就變成下拉選單
                else if (tNowRow.Cells["Type"].Value.ToString() == "combo")
                {
                    DataGridViewComboBoxCell tCell = new DataGridViewComboBoxCell();

                    for (int i = 0; i < tNowRow.Cells["AllowedValues"].Value.ToString().Split(';').Length; i++)
                    {
                        tCell.Items.Add(tNowRow.Cells["AllowedValues"].Value.ToString().Split(';')[i]);
                    }

                    dataGridView1["Value", dataGridView1.CurrentRow.Index] = tCell;
                }
            }
        }
    }
}

--
vbnet


If True Then
'如果是點在Value欄位的話才出現
If e.ColumnIndex = 1 Then
Dim tNowRow As DataGridViewRow = dataGridView1.Rows(dataGridView1.CurrentRow.Index)

If tNowRow.Cells("Type").Value IsNot Nothing Then
If tNowRow.Cells("Type").Value IsNot Nothing Then
'如果是bool的話就變成CheckBox
If tNowRow.Cells("Type").Value.ToString() = "bool" Then
dataGridView1("Value", dataGridView1.CurrentRow.Index) = New DataGridViewCheckBoxCell()
'如果是combo的話就變成下拉選單
ElseIf tNowRow.Cells("Type").Value.ToString() = "combo" Then
Dim tCell As New DataGridViewComboBoxCell()

Dim i As Integer = 0
While i < tNowRow.Cells("AllowedValues").Value.ToString().Split(";"C).Length
tCell.Items.Add(tNowRow.Cells("AllowedValues").Value.ToString().Split(";"C)(i))
i += 1
End While

dataGridView1("Value", dataGridView1.CurrentRow.Index) = tCell
End If
End If
End If
End If
End If

2020年4月22日 星期三

VBNET 將字串分割,並產生字串陣列

VBNET 將字串分割,並產生字串陣列
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' === 字串切割 ===
        Dim MyString = "09/02/04     4:00p   21.9 21.9  21.8 69     15.9            3.6 NE        2.15 6.3 "
        Dim charSeparators() As Char = {" "c}
        Dim strResult() = MyString.Trim().Split(charSeparators, StringSplitOptions.RemoveEmptyEntries)

        ' === 顯示 ===
        For i As Integer = 0 To strResult.Length - 1
            Me.TextBox1.Text += strResult(i) + Environment.NewLine
        Next
    End Sub
End Class

-------
另外 微軟又有調整新的用法
Strings.Split(String, String, Int32, CompareMethod) 方法

Dim testString As String = "apple    pear banana  "
Dim testArray() As String = Split(testString)
' testArray holds {"apple", "", "", "", "pear", "banana", "", ""}
Dim lastNonEmpty As Integer = -1
For i As Integer = 0 To testArray.Length - 1
    If testArray(i) <> "" Then
        lastNonEmpty += 1
        testArray(lastNonEmpty) = testArray(i)
    End If
Next
ReDim Preserve testArray(lastNonEmpty)
' testArray now holds {"apple", "pear", "banana"}

2020年4月7日 星期二

2020年最新鉅作-服裝租借系統+電子發票#4

POS功能面及電子發票區塊總算完成了,接下來要將租借訂單串聯POS付款結帳
和一些帳統計及報表
整個系統架構為多門市多機台模式,每一基座均可前台.後台併用

歡迎市面相關服裝租借又想要併POS系統的店家,來洽詢喔

google : 池龍工作室

就能找到跟我聯絡的方式
---







2020年3月26日 星期四

2020年最新鉅作-服裝租借系統+電子發票#3

服裝租借系統區塊,總算完成90%的進度了
再來要準備
1.寫POS收銀系統+電子發票
2.租借訂單列印+出單機印訂單編號轉條碼(可刷)張數
3.租借訂單串聯POS付款
4.日結帳
5.報表
--



2020年3月6日 星期五

天堂M自動簽到和收信

---
之前寫了偵測HP/MP 和掛機地點的  實在不是很準確 就放棄了
看現外掛都好強...
現天堂M 又出日程~ 真的根本是養電子雞了
花了點時間~寫一下簽到和收信   看看穩不穩

2020年3月4日 星期三

戲服出租系統V5-創憶變裝服裝道具出租

20200311 更新 (請店家拍一下實體店,感謝!!)
--
感謝-創憶變裝服裝道具出租 - 使用本工作室 [ 戲服出租系統V5 ] 網路版
--
剛剛google了一下,原來店還真帥;也有官網

創憶變裝服裝道具出租官方網站






2020年2月26日 星期三

Crystal Report由指定印表機直接列印

Crystal Report由指定印表機直接列印

將Crystal Report報表直接由指定印表機輸出
事前:引用Crystal Report DLL(Visual Studio 2010 後沒有內建Crystal Report,需自行到SAP網站下載)
using CrystalDecisions.CrystalReports.Engine;

Step1:顯示Print Dialog讓User挑選印表機
PrinterSettings printerSettings = new PrinterSettings();
PrintDialog printDialog = new PrintDialog();
printDialog.PrinterSettings = printerSettings;
printDialog.AllowPrintToFile = false;
printDialog.AllowSomePages = true;             
printDialog.UseEXDialog = true;

Step2:指定Crystal Report輸出印表機
DataTable DT = new DataTable();//資料來源
ReportDocument rpDoc = new ReportDocument();
Rec.Load(string.Concat(System.Environment.CurrentDirectory, @"\RPT_FORM\檔名.rpt"));
Rec.SetDataSource(DT);
rpDoc.PrintOptions.PrinterName = printerSettings.PrinterName;
rpDoc.PrintToPrinter(printerSettings.Copies, false, 0, 0);

※ReportDocument.PrintToPrinter 方法※
public virtual void PrintToPrinter (int nCopies , bool collated , int startPageN , int endPageN );
參數:
nCopies       //指出列印份數。
collated        //指出是否自動分頁。
startPageN  //指出要列印的第一頁。參數設定為 0 即可列印所有頁面
endPageN   //指出要列印的最後一頁。參數設定為 0 即可列印所有頁面

2020年2月24日 星期一

2020年最新鉅作-服裝租借系統+電子發票#1

基本檔的模板總算打造完成
再來就是趕工,先把基本檔全部完成
後面的模組功能還好多要加工
---



2020年2月14日 星期五

2020年最新鉅作-服裝租借系統+電子發票

2020年最新鉅作-服裝租借系統

老客戶一路支持相挺了10幾年了,也相信我的能力
因時代在變,整個租界也在改變;在現在這網路發達的時代
客戶要求再開發新的系統,我本是很不想再開發系統了;畢竟也步入中年了...
跟客戶提,這次系統完成後;應該可以讓你們用到N代了
也打算將本身技術和經驗全部貫徹在這軟體系統上,希望可以用得長長久久
--
目前看到的系統畫面,僅是初步主畫面框架而已;後面還一卡車的功能要努力打造..
系統主核心是在租借並結合電子發票和官方TrunKey全自動上下傳
也併入了網訂及貨運和付款;架構極大
--
等系統全部打造完成後,再來貼成果了...


2020年1月14日 星期二

開發 RWD 網站

最近在忙進行案子:開發 RWD 網站
主要亮點在:商品及模組SKP下載
目前影片只秀前端操作(後端就不秀了),已差不多完成;就剩語言切換部分

今年將會很忙,案子陸續進來;所以Blog 有空還是會來更新一下

--