private (string, List <DbCommandParameter.DbCommandParameter>, IList <ParseError>) CreateInsertStatement(string tableName, DataTable records, ICollection <DbCommandParameter.DbCommandParameter> parameter = null) { var statement = CreateStatement(tableName); statement = AddColumnReferenceExpression(statement, records); statement.InsertSpecification.InsertOption = InsertOption.Into; var listParams = new List <DbCommandParameter.DbCommandParameter>(parameter ?? new DbCommandParameter.DbCommandParameter[] { }); var numberParams = 0; statement.InsertSpecification.InsertSource = new ValuesInsertSource(); IList <ParseError> parseErrors; foreach (DataRow row in records.Rows) { var rv = new RowValue(); foreach (DataColumn column in records.Columns) { var cell = row[column]; if (cell is string name) { var exp = new TSql100Parser(false).ParseExpression( new System.IO.StringReader(name), out parseErrors); if (exp.GetType() == typeof(VariableReference) || exp.GetType() == typeof(GlobalVariableExpression)) { rv.ColumnValues.Add(new VariableReference() { Name = name }); continue; } } while (listParams.Any(_ => _.Name == $"p{numberParams}")) { numberParams++; } rv.ColumnValues.Add(new VariableReference() { Name = $"@p{numberParams}" }); listParams.Add( new DbCommandParameter.DbCommandParameter( $"p{numberParams}", DbType.Object, cell)); numberParams++; } ((ValuesInsertSource)statement.InsertSpecification.InsertSource).RowValues.Add(rv); } var generator = new Sql100ScriptGenerator(); generator.GenerateScript(statement, out var query, out parseErrors); return(query, listParams, parseErrors); }
public static string GetText(this TSqlFragment fragment) { string script; _scriptGenerator.GenerateScript(fragment, out script); script = script.Replace(_dynamicPlaceholder, "?"); script = script.Replace(";", string.Empty); return(script.Trim()); }
private void Generate(Sql100ScriptGenerator scripter, bool quotedIdentifier, String inputScript) { SQLParser parser = new SQLParser(SqlVersion.Sql100, quotedIdentifier, inputScript); scripter.GenerateScript(parser.Fragment, out script); }