這SQLCE代碼看起來非常奇怪,我說:我應該重構一下嗎?還是我的混亂導致謹慎?
cmd.CommandText = "INSERT INTO departments (account_id, name) VALUES (?, ?)";
foreach(DataTable tab in dset.Tables)
{
if (tab.TableName == "Departments")
{
foreach(DataRow row in tab.Rows)
{
Department Dept = new Department();
if (!ret)
ret = true;
foreach(DataColumn column in tab.Columns)
{
if (column.ColumnName == "AccountID")
{
Dept.AccountID = (string) row[column];
}
else if (column.ColumnName == "Name")
{
if (!row.IsNull(column))
Dept.AccountName = (string) row[column];
else
Dept.AccountName = "";
}
}
List.List.Add(Dept);
. . .
dSQL = "INSERT INTO departments (account_id, name) VALUES ('" + Dept.AccountID + "','" + Dept.AccountName +"')";
if (!First)
{
cmd.Parameters[0].Value = Dept.AccountID;
cmd.Parameters[1].Value = Dept.AccountName;
}
if (First)
{
cmd.Parameters.Add("@account_id",Dept.AccountID);
cmd.Parameters.Add("name",Dept.AccountName);
cmd.Prepare();
First = false;
}
if (frmCentral.CancelFetchInvDataInProgress)
{
ret = false;
return ret;
}
try
{
dbconn.DBCommand(cmd, dSQL, true);
}
. . .
public void DBCommand(SqlCeCommand cmd, string dynSQL, bool Silent)
{
SqlCeTransaction trans = GetConnection().BeginTransaction();
cmd.Transaction = trans;
try
{
cmd.ExecuteNonQuery();
trans.Commit();
}
catch (Exception ex)
{
try
{
trans.Rollback();
}
catch (SqlCeException)
{
// Handle possible exception here
}
MessageBox.Show("DBCommand Except 2"); // This one I haven't seen...
WriteDBCommandException(dynSQL, ex, Silent);
}
}
我的問題是: 「?」
1)宜真的被用於cmd.CommandText的賦值,還是應該使用「@」來代替?
2)其中的 「cmd.Parameters.Add()」 S(ACCOUNT_ID的)使用 「@」 和其他(名稱)不。哪種方式是對的,還是「@」可選?
3)我不能爲什麼的DBCommand()被寫成它是正面還是反面 - 如果有一個例外,最終有兩個參數僅用於... ???
我很想從根本上重構這個代碼,因爲它似乎很離奇,但因爲我真的不明白,這可能是一個災難......
這是SQL Server ..?如果是這樣的話,爲什麼不在插入命令時使用'@'符號,而使用'?'就像Access所期望的那樣。我會重構那些代碼以實現使用/使用.Parameters.AddWithValue()方法。 。我甚至會在你嘗試添加參數的地方將代碼封裝在try {} catch {}中。''''等同於'@',但看起來像DataAdapter樣式編碼我可能會被誤認爲.. – MethodMan
我會重構它的一些存儲過程,並與數據調用。 – Romoku
如果代碼有效,那麼最好在http://codereview.stackexchange.com/上詢問。 –