// /// <summary> // /// 서버의 DataTable을 클라이언트의 자바스크립트에서 쓸 수 있도록 변경함. // /// </summary> // /// <param name="dt"></param> // /// <param name="AddScriptTag"><script> 태그 추가</param> // /// <remarks>오라클의 경우는 필드 이름이 전부 대문자로 리턴되므로 소문자로 변경하려면 ColumnNameToLower 인수를 true로 할 것.</remarks> // /// <returns></returns> // private static string GetClientDataSet(object DataSetOrDataTable, string VarName, bool IsArray, bool IsDataTable, bool ColumnNameToLower, bool AddScriptTag) // { // List<DataSet> ads = new List<DataSet>(); // List<DataTable> adt = new List<DataTable>(); // if (IsDataTable) // { // if (IsArray) // { // adt.AddRange((IEnumerable<DataTable>)DataSetOrDataTable); // } // else // { // adt.Add((DataTable)DataSetOrDataTable); // } // } // else // { // if (IsArray) // { // ads.AddRange((IEnumerable<DataSet>)DataSetOrDataTable); // } // else // { // ads.Add((DataSet)DataSetOrDataTable); // } // } // List<string> aStmt = new List<string>(); // if (IsDataTable) // { // if (IsArray) // { // aStmt.Add("var " + VarName + " = [];"); // } // for (int nTbl = 0; nTbl < adt.Count; nTbl++) // { // DataTable dt = adt[nTbl]; // string VarNameCur = IsArray ? VarName + "[" + nTbl + "]" : VarName; // aStmt = GetClientDataTableCommon(aStmt, dt, VarNameCur, ColumnNameToLower); // } // } // else // { // /* //var ads = []; //ads[0] = { }; //ads[0].Tables = []; //ads[0].Tables[0] = new CDataTable(); //ads[0].Tables[1] = new CDataTable(); //ads[1].Tables = []; //ads[1].Tables[0] = new CDataTable(); //ads[1].Tables[1] = new CDataTable(); //var ds = { }; //ds.Tables = []; //ds.Tables[0] = new CDataTable(); //ds.Tables[1] = new CDataTable(); //*/ // if (IsArray) // aStmt.Add("var " + VarName + " = [];"); // else // aStmt.Add("var " + VarName + " = { Tables: [] };"); // for (int nDs = 0; nDs < ads.Count; nDs++) // { // DataSet ds = ads[nDs]; // if (IsArray) // aStmt.Add(VarName + "[" + nDs + "] = { Tables: [] };"); // string VarNameCur = IsArray ? VarName + "[" + nDs + "].Tables" : VarName + ".Tables"; // for (int nTbl = 0; nTbl < ds.Tables.Count; nTbl++) // { // DataTable dt = ds.Tables[nTbl]; // string VarNameCur2 = VarNameCur + "[" + nTbl + "]"; // aStmt = GetClientDataTableCommon(aStmt, dt, VarNameCur2, ColumnNameToLower); // } // } // } // string s = CScript.GetScript(aStmt, AddScriptTag); // return s; // } //private static List<string> GetClientDataTableCommon(List<string> aStmt, DataTable dt, string VarName, bool ColumnNameToLower) //{ // aStmt.Add(VarName + " = new CDataTable();"); // string[] aColName = GetColumnNameInArray(dt, ColumnNameToLower); // string ColumnNameList = ""; // for (int cl = 0; cl < aColName.Length; cl++) // { // ColumnNameList += ", \"" + aColName[cl] + "\""; // } // ColumnNameList = ColumnNameList.Substring(2); // aStmt.Add(VarName + ".Columns = [ " + ColumnNameList + " ];"); // string RowList = GetClientDataRow(dt, aColName); // aStmt.Add(VarName + ".Rows = " + RowList + ";"); // return aStmt; //} //public static string GetClientDataRow(DataTable dt, string[] aColName) //{ // List<string> aRow = new List<string>(); // for (int rw = 0, rw2 = dt.Rows.Count; rw < rw2; rw++) // { // DataRow dr = dt.Rows[rw]; // string[] aNameValue = new string[dt.Columns.Count]; // for (int cl = 0, cl2 = dt.Columns.Count; cl < cl2; cl++) // { // object oValue = dr[cl]; // string Text = GetValueForJson(oValue); // //JSON 형식을 리턴할 때 Name에 큰 따옴표를 붙여야만 에러를 내지 않음. // aNameValue[cl] = "\"" + aColName[cl] + "\":" + Text; // } // string NameValueList = string.Join(", ", aNameValue); // aRow.Add("{ " + NameValueList + " }"); // } // string RowList = "[ " + string.Join(",\r\n", aRow.ToArray()) + " ]"; // return RowList; //} //public static string GetClientDataRow(DataTable dt) //{ // string[] aColName = GetColumnNameInArray(dt); // return GetClientDataRow(dt, aColName); //} /// <summary> /// JSON 형식으로 리턴하기 위함. /// null은 null로, 날짜 형식과 문자열은 따옴표를 양쪽에 묶고, 나머지는 따옴표를 묶지 않은 값을 리턴함. /// </summary> /// <param name="oValue"></param> /// <returns></returns> public static string GetValueForJson(object oValue) { string NullString = "null"; string Delim = ""; string Text = CType.ConvertColumnValueToString(oValue, NullString); if (Text != NullString) { SqlColumnTypeSimple TypeSimple = CSql.GetColumnTypeSimple(oValue); if (TypeSimple == SqlColumnTypeSimple.DateTime) { Delim = "\""; var dtValue = (DateTime)oValue; Text = Delim + dtValue.ToString(CConst.Format_yyyy_MM_dd_HH_mm_ss_fff) + Delim; //new Date는 JSON 형식에 맞지 않으므로 주석. //Text = string.Format("new Date({0}, {1}, {2}, {3}, {4}, {5}, {6})", // dtValue.Year, dtValue.Month - 1, dtValue.Day, // dtValue.Hour, dtValue.Minute, dtValue.Second, dtValue.Millisecond); } else if (TypeSimple == SqlColumnTypeSimple.Boolean) { Text = (bool)oValue ? "true" : "false"; } else { Delim = (TypeSimple == SqlColumnTypeSimple.String) ? "\"" : ""; Text = Delim + CScript.ReplaceForScriptVariable(Text) + Delim; } } return(Text); }
private static string GetSqlTemplateReplaced(string Sql, DbServerType DSType, List <CSqlNameValueKeepValue> aNameValueKeepValue) { foreach (CSqlNameValueKeepValue nvk in aNameValueKeepValue) { string FieldName = nvk.Name; bool KeepValue = nvk.KeepValue; string Value = ""; if (nvk.Value == null) { Value = "null"; } else if (KeepValue) { //함수나 연산자가 사용된 경우엔 변형하지 않음. Value = nvk.Value.ToString(); } else { SqlColumnTypeSimple ColumnType = GetColumnTypeSimple(nvk.Value); switch (ColumnType) { case SqlColumnTypeSimple.DateTime: case SqlColumnTypeSimple.String: Value = nvk.Value.ToString(); Value = "'" + Value.Replace("'", "''"); if (DSType == DbServerType.MySQL) { Value = Value.Replace(@"\", @"\\"); } Value += "'"; break; case SqlColumnTypeSimple.Boolean: Value = CFindRep.IfTrueThen1FalseThen0((bool)nvk.Value); break; case SqlColumnTypeSimple.Numeric: Value = nvk.Value.ToString(); break; } } Sql = Sql.Replace("{{" + FieldName + "}}", Value); } return(Sql); }
///// <summary> ///// \r\n, \r, \n, \t 등 정상적으로 입력되지 않는 문자열이 구분자로 쓰였다면 ///// 해당 문자열들을 CD in (1, 2, 3)과 in 절에 넣을 수 있도록 "1, 2, 3"과 같이 변환해서 리턴함. ///// </summary> ///// <param name="Value"> </param> ///// <param name="IsNumberType">숫자형식의 필드인 지 여부 </param> ///// <param name="IsMultipleIs">in 절에 들어갈 수 있도록 콤마로 구분된 값으로 변환되었는 지 여부 </param> ///// <example> ///// bool IsMultipleIs; ///// string SQL = "", SQLIn = ""; ///// ///// SQL = "select * from CodeList"; ///// SQLIn = GetInList("1\t2\t3", true, out IsMultipleIs); ///// if (IsMultipleIs) ///// { ///// SQL += " where Code in (" + SQLIn + ")"; ///// } ///// else ///// { ///// SQL += " where Code = " + SQLIn; ///// } ///// Console.WriteLine(SQL); //"select * from CodeList where Code in (1, 2, 3)" ///// ///// SQL = "select * from JobList"; ///// SQLIn = GetInList("학생\t교사\t프로그래머", false, out IsMultipleIs); ///// if (IsMultipleIs) ///// { ///// SQL += " where JobName in (" + SQLIn + ")"; ///// } ///// else ///// { ///// SQL += " where JobName = " + SQLIn; ///// } ///// Console.WriteLine(SQL); //"select * from JobList where JobName in ('학생', '교사', '프로그래머')" ///// </example> //public static string GetInList(string Value, bool IsNumberType, // out bool IsMultipleIs) //{ // char[] Delim; // string ValueList = ""; // IsMultipleIs = false; // Delim = GetDelimChar(Value); // if (Delim.Length == 0) // { // return Value; // } // ValueList = GetInList(Value.Split(Delim), IsNumberType); // IsMultipleIs = true; // return ValueList; //} public static string GetInList <T>(T[] aValue) { string ValueList = ""; SqlColumnTypeSimple TypeSimple = GetColumnTypeSimple(typeof(T)); string Delim = CLang.In(TypeSimple, SqlColumnTypeSimple.DateTime, SqlColumnTypeSimple.String) ? "'" : ""; for (int i = 0; i < aValue.Length; i++) { ValueList += "," + Delim + aValue[i] + Delim; } if (!string.IsNullOrEmpty(ValueList)) { ValueList = ValueList.Substring(1); } return(ValueList); }
public static void SortByRelation(DataTable dt, string ColumnNameId, string ColumnNameParentId) { DataRow[] adr = dt.Select(string.Format("{0} > ''", ColumnNameParentId)); if (adr.Length == 0) { return; } object ParentId = adr[0][ColumnNameParentId]; SqlColumnTypeSimple ColumnType = CSql.GetColumnTypeSimple(ParentId); if ((ColumnType == SqlColumnTypeSimple.DateTime) || (ColumnType == SqlColumnTypeSimple.Boolean)) { throw new Exception(string.Format("ColumnType: '{0}' is not allowed.", ColumnType)); } string Parenthesis = (ColumnType == SqlColumnTypeSimple.String) ? "'" : ""; //하위 행을 추가할 때 원래의 순서를 유지하기 위해 거꾸로 루핑을 함 for (int rw = (adr.Length - 1); rw >= 0; rw--) { DataRow dr = adr[rw]; object ParentIdCur = dr[ColumnNameParentId]; string Filter = string.Format("{0} = {1}{2}{1}", ColumnNameId, Parenthesis, ParentIdCur); DataRow[] adrParent = dt.Select(Filter); if (adrParent.Length == 0) { continue; } else if (adrParent.Length >= 2) { throw new Exception(string.Format("{0} is not unique. Duplicated value: {1}", ColumnNameId, ParentIdCur)); } DataRow drParent = adrParent[0]; CDataTable.MoveRow(dt, dt.Rows.IndexOf(dr), dt.Rows.IndexOf(drParent) + 1); } }