一,執行INSERT報錯
前提條件:在執行INSERT操作時,表中的“是/否”類型和”時間“類型。
問題:用Dapper的Dynamic 如”new {a=AA}“,就算是按SQL的參數與PARAMETER一一對應都會, 報錯如下:”標准表達式中數據類型不匹配。“
解決辦法:
采用DynamicParameters
代碼如下:

DynamicParameters用法var p = new DynamicParameters();
p.Add("Date", dpDate.SelectedDate != null ? dpDate.SelectedDate.Value.ToString("yyyy-MM-dd") : DateTime.MinValue.ToString("yyyy-MM-dd"));
p.Add("Staff", txtStaff.Text);
p.Add("CustomerName", txtCustomerName.Text);
p.Add("CompanyNo", txtCompanyNo.Text);
p.Add("FileName", txtFileName.Text);
p.Add("Craft", txtCraft.Text);
p.Add("GK", txtGK.Text);
p.Add("ZHColor", txtZHColor.Text);
p.Add("BH", txtBH.Text);
p.Add("TH", txtTH.Text);
p.Add("Material", txtMaterial.Text);
p.Add("CAM", txtCAM.Text);
p.Add("IsFast", cbIsFast.Checked, DbType.Boolean);
p.Add("Remark", txtRemark.Text);
注意:雖然DynamicParameters中有參數同樣也可以加Dynamic 類型,但經本人測試不起作用,還是用上面的才可以解決。
二,用LIKE 查詢問題
問題描述:在網上有很多人說ACCESS中的LIKE和SQL SERVER 不一樣,要用*,結果我測試不對還是得用”%”。
有的要用這種方式寫:

其它人對Like的用法了安全起見在使用access的時候為了安全,變量一般都用參數的形式傳遞。如下面的寫法。
string sql = “select * from orders where order_title like ‘%@title%’“;
OleDbParameter[] paras = new OleDbParameter[]
{
new OleDbParameter(“@title”,title),
};
一般這樣寫都沒事,但是模糊查詢(即like查詢)這個寫就不對了。怎么寫才對呢?
下面為正確的寫法
string sql = “select * from orders where order_title like @title or order_content like @title”;
OleDbParameter[] paras = new OleDbParameter[]
{
new OleDbParameter(“@title”,”%”+title+”%”),
};
經過我測試這2種方式都可以。而我用DynamicParameters老是報錯。同樣的錯誤:“標准表達式中數據類型不匹配。“
先看一下問題代碼吧:

問題代碼string sql = "select * from DataInfo where[Date] between @stratTime and @endTime and [CAM] LIKE @cam";
DynamicParameters p = new DynamicParameters();
p.Add("@cam", "%" + txtCamName.Text + "%");
p.Add("stratTime", dpStart.SelectedDate.Value.ToString("yyyy-MM-dd"));
p.Add("endTime", dpEnd.SelectedDate.Value.ToString("yyyy-MM-dd"));
問題原因:
這個問題是因為SQL中的參數和PARAMETER中的參數沒有一一對應,這個好像在OleDbParameter中也會有這種問題,這個是因為ACCESS的原因在SQL SERVER 就不會有類型的問題,
解決辦法:
將 p.Add("@cam", "%" + txtCamName.Text + "%");放到最后一個因為在SQL中他的參數也是在最后:

正確代碼DynamicParameters p = new DynamicParameters();
p.Add("stratTime", dpStart.SelectedDate.Value.ToString("yyyy-MM-dd"));
p.Add("endTime", dpEnd.SelectedDate.Value.ToString("yyyy-MM-dd"));
p.Add("@cam", "%" + txtCamName.Text + "%");