代碼生成器遍歷所有屬性,透過 BindFieldAttribute.Key 識別主鍵欄位,並建立對應的 SQL 參數名稱與 WHERE 條件字串:
ArrayList keyProps = new ArrayList();
ArrayList keyParamNames = new ArrayList();
StringBuilder whereSql = new StringBuilder();
for (int i = 0; i < ps.Length; i++) {
PropertyInfo p = ps[i];
if (!p.CanRead) continue;
BindFieldAttribute fa = (BindFieldAttribute)Attribute.GetCustomAttribute(p, typeof(BindFieldAttribute));
if (!fa.Key) continue;
string fieldName = GetBindFieldName(p);
if (whereSql.Length > 0) whereSql.Append(" AND ");
keyProps.Add(p);
if (bolNamedParameter) {
string pName = "Key" + p.Name;
keyParamNames.Add(pName);
whereSql.Append(FixFieldName(fieldName) + " = @" + pName + " ");
} else {
whereSql.Append(FixFieldName(fieldName) + " = ? ");
}
}
若無關鍵屬性,輸出拋出異常代碼;否則生成參數檢查、實體轉型、SQL 指派、參數綁定等完整流程:
writer.WriteLine("public override int FillDeleteCommand(IDbCommand cmd, object objRecord)");
writer.BeginGroup("{");
if (keyProps.Count == 0) {
writer.WriteLine("throw new NotSupportedException(\"FillDeleteCommand\");");
} else {
writer.WriteLine("if (cmd == null) throw new ArgumentNullException(\"cmd\");");
writer.WriteLine("if (objRecord == null) throw new ArgumentNullException(\"objRecord\");");
writer.WriteLine($"{recordType.FullName} myRecord = objRecord as {recordType.FullName};");
writer.WriteLine($"if (myRecord == null) throw new ArgumentException(\"must type '{recordType.FullName}'\");");
StringBuilder deleteSql = new StringBuilder();
deleteSql.Insert(0, "DELETE FROM " + tableName + " WHERE " + whereSql);
writer.WriteLine("cmd.Parameters.Clear();");
writer.WriteLine($"cmd.CommandText = @\"{deleteSql}\";");
writer.WriteLine("IDbDataParameter parameter = null;");
for (int idx = 0; idx < keyProps.Count; idx++) {
PropertyInfo p = (PropertyInfo)keyProps[idx];
writer.WriteLine("parameter = cmd.CreateParameter();");
WriteSetParameterValue(p, writer);
if (bolNamedParameter) {
writer.WriteLine($"parameter.ParameterName = \"{keyParamNames[idx]}\";");
}
writer.WriteLine("cmd.Parameters.Add(parameter);");
}
writer.WriteLine($"return {keyProps.Count};");
}
writer.EndGroup("}");
WriteSetParameterValue 依型別處理:
BindFieldAttribute.WriteFormat 或預設格式 yyyy-MM-dd HH:mm:ss。DBNull.Value。FillDeleteCommand 時檢查主鍵存在性,允許無主鍵實體用於查詢/新增。IndentTextWriter 產生縮排整齊的代碼,利於除錯與維護。