📄 codegenerator.cs
字号:
}
return list;
}
private CodeTypeMemberCollection GenerateProperties(DataColumnCollection columns)
{
CodeTypeMemberCollection list = new CodeTypeMemberCollection();
foreach (DataColumn col in columns)
{
/*
* Creating property
*/
CodeMemberProperty property = CreateProperty(col.ColumnName, col.DataType);
/*
* Adding mappings for the column
*/
CodeAttributeDeclaration cad = GenerateAttribute(col.ColumnName);
if (cad != null)
property.CustomAttributes.Add(cad);
list.Add(property);
}
return list;
}
private CodeMemberProperty CreateProperty(string columnName, Type dataType)
{
return CreateProperty(columnName, dataType.ToString());
}
private CodeMemberProperty CreateProperty(string columnName, string dataType)
{
/*
* Add a property for a column
*/
CodeMemberProperty property = new CodeMemberProperty();
property.Attributes = MemberAttributes.Public;
property.Name = GetPublicName(columnName);
property.Type = new CodeTypeReference(dataType);
property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), GetPrivateName(columnName))));
property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), GetPrivateName(columnName)), new CodePropertySetValueReferenceExpression()));
return property;
}
private CodeAttributeDeclaration GenerateAttribute(string columnName)
{
/*
* Creating mapping Attribute
*/
CodeAttributeDeclaration cad = null;
if (columnsInfo.ContainsKey(columnName))
{
ColumnInfo ci = columnsInfo[columnName];
if (ci.Pk == 1) // It's a PK Column, add the IdColumn attribute
{
cad = new CodeAttributeDeclaration(new CodeTypeReference(typeof(IdColumn)));
cad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(columnName)));
}
else if (ci.Fk == 1) // It's a foreign key column add a ObjectColumn attribute
{
string className = GetPublicName(ci.RefTableName);
if (generateTree) // Follow foreign keys and generate the classes
{
CodeGenerator cg = new CodeGenerator(tableIgnoreList, ci.RefTableName, nameSpace, generateFromTable, saveAsFile, connection);
cg.Generate(className, true, generateDBPkg, outputDirectory);
if (cg.Class != null && !saveAsFile)
cs.Types.Add(cg.Class);
}
cad = new CodeAttributeDeclaration(new CodeTypeReference(typeof(ObjectColumn)));
cad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(columnName)));
cad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression("OracleDbType.Decimal")));
cad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression(string.Format("typeof({0})", className))));
}
foreach (ColumnInfo cil in ci.Links)
{
/*
* Found some foreign keys. Generate the classes and add references to them.
*/
string className = GetPublicName(cil.TableName);
CodeGenerator cg = new CodeGenerator(tableIgnoreList, cil.TableName, nameSpace, generateFromTable, saveAsFile, connection);
cg.Generate(className, true, generateDBPkg, outputDirectory);
if (cg.Class != null)
{
CodeMemberProperty property = CreateProperty(cil.TableName, string.Format("List<{0}>", className));
CodeAttributeDeclaration listCad = new CodeAttributeDeclaration(new CodeTypeReference(typeof(ListColumn)));
listCad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(columnName)));
listCad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(cil.ColumnName)));
listCad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression("stored proc")));
listCad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression("Method.Select")));
listCad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression("CommandType.StoredProcedure")));
listCad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression(string.Format("typeof({0})", className))));
listCad.Arguments.Add(new CodeAttributeArgument(new CodeVariableReferenceExpression("OracleDbType.Decimal")));
property.CustomAttributes.Add(listCad);
foreignPropertyList.Add(property);
if (!saveAsFile)
cs.Types.Add(cg.Class);
}
}
}
else // Just a column, add the DbColumn attribute
{
cad = new CodeAttributeDeclaration(new CodeTypeReference(typeof(DbColumn)));
cad.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(columnName)));
}
return cad;
}
#endregion
#region Generate methods
private CodeMemberMethod GenerateLoadMethod(DataColumnCollection columns)
{
CodeMemberMethod method = new CodeMemberMethod();
return new CodeMemberMethod();
}
private CodeMemberMethod GenereateSaveMethod(DataColumnCollection columns)
{
return new CodeMemberMethod();
}
#endregion
#region Support functions
private bool GenerateDBPkg(string tableName)
{
string pkgName = string.Format("{0}$", tableName);
List<OracleParameter> pkgHeaderOp = new List<OracleParameter>();
pkgHeaderOp.Add(new OracleParameter("p_p", OracleDbType.Clob, ParameterDirection.ReturnValue));
pkgHeaderOp.Add(new OracleParameter("p_table_name", OracleDbType.Varchar2, tableName, ParameterDirection.Input));
pkgHeaderOp.Add(new OracleParameter("p_package_name", OracleDbType.Varchar2, pkgName, ParameterDirection.Input));
string pkgHeader = (string)DBUtils.ExecuteNonQuery(CreatePackage, pkgHeaderOp, connection, CommandType.StoredProcedure, OracleDbType.Clob);
List<OracleParameter> pkgBodyOp = new List<OracleParameter>();
pkgBodyOp.Add(new OracleParameter("p_p", OracleDbType.Clob, ParameterDirection.ReturnValue));
pkgBodyOp.Add(new OracleParameter("p_table_name", OracleDbType.Varchar2, tableName, ParameterDirection.Input));
pkgBodyOp.Add(new OracleParameter("p_package_name", OracleDbType.Varchar2, pkgName, ParameterDirection.Input));
string pkgBody = (string)DBUtils.ExecuteNonQuery(CreatePackageBody, pkgBodyOp, connection, CommandType.StoredProcedure, OracleDbType.Clob);
if (pkgHeader != null && pkgBody != null)
{
bool result = true;
result &= DBUtils.Execute(pkgHeader, null, CommandType.Text, connection);
result &= DBUtils.Execute(pkgBody, null, CommandType.Text, connection);
return result;
}
else
return false;
}
private void LoadColumnsInfo(string tableName)
{
DatabaseLoader dl = new DatabaseLoader();
Param tblParam = new Param("TABLE_NAME", tableName.ToUpper());
Param refParam = new Param("REFERENCE", 0);
IList<ColumnInfo> cols = dl.LoadAll<ColumnInfo>(new Param[] { tblParam }, connection);
columnsInfo.Clear();
bool hasPK = false;
foreach (ColumnInfo ci in cols)
{
if (ci.Pk == 1)
hasPK = true;
if (!columnsInfo.ContainsKey(ci.ColumnName))
columnsInfo.Add(ci.ColumnName, ci);
}
if (!hasPK)
throw new Exception(string.Format("Table {0} is missing primary key", tableName));
}
public static string GetPrivateName(string name)
{
name = name.ToLower();
if (name.IndexOf('_') == -1)
return name;
int i = 0;
StringBuilder sb = new StringBuilder();
while (i < name.Length)
{
if (name[i] == '_')
{
sb.Append(name[i + 1].ToString().ToUpper());
i++;
}
else
sb.Append(name[i]);
i++;
}
return sb.ToString();
}
public static string GetPublicName(string name)
{
name = GetPrivateName(name);
char c = name[0];
name = name.Remove(0, 1);
name = c.ToString().ToUpper() + name;
return name;
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -