コード例 #1
0
        public State Go(ref State state)
        {
            if (state == null)
            {
                throw new ArgumentNullException(nameof(state));
            }

            var fields = _schemaFetcher.GetFields(state._4Config.defaultConnection, state._4Config.provider, state._6QueryWithParamsAdded);

            if (fields.Count == 0)
            {
                fields = _provider.GetQuerySchema2ndAttempt(state._6QueryWithParamsAdded, state._4Config.defaultConnection);
            }
            fields.ForEach(field =>
            {
                if (Regex.Match((field.ColumnName.Substring(0, 1)), "[0-9]").Success)
                {
                    field.CSColumnName = "_" + field.ColumnName;
                }
                else
                {
                    field.CSColumnName = field.ColumnName;
                }
                if (field.ColumnName.IndexOf('?') != -1)
                {
                    field.CSColumnName = field.CSColumnName.Substring(0, field.ColumnName.IndexOf('?'));

                    var columnOptions = new Dictionary <string, string>();

                    // todo let's have some tests for this little-used functionality.
                    var parts = field.ColumnName.Split('?');
                    if (parts.Length == 2)
                    {
                        var nameVals = parts[1].Split('&');
                        foreach (var option in nameVals)
                        {
                            var nameVal = option.Split('=');
                            columnOptions.Add(nameVal[0], nameVal.Length > 1 ? nameVal[1] : null);
                        }
                    }
                    field.ColumnOptions = columnOptions;
                }
            });
            state._7ResultFields = fields;
            if (state._7ResultFields != null && state._7ResultFields.Count > 0)
            {
                // Execute scalar return type should always be nullable, even when the underlying column is not nullable.
                if (IsNullable(Type.GetType(state._7ResultFields[0].TypeCs, false)) || state._7ResultFields[0].TypeCs == "System.String")
                {
                    state._7ExecuteScalarReturnType = state._7ResultFields[0].TypeCs;
                }
                else
                {
                    state._7ExecuteScalarReturnType = state._7ResultFields[0].TypeCs + "?";
                }
            }

            return(state);
        }
コード例 #2
0
        public State Go(ref State state)
        {
            var matchInsert = Regex.Match(state._3InitialQueryText, @"^insert\s+into\s+(?<tableName>\w+)\.\.\.", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            var matchUpdate = Regex.Match(state._3InitialQueryText, @"^update\s+(?<tableName>\w+)\.\.\.", RegexOptions.IgnoreCase | RegexOptions.Multiline);

            if (matchInsert.Success || matchUpdate.Success)
            {
                var targetTable = matchInsert.Success ? matchInsert.Groups["tableName"].Value : matchUpdate.Groups["tableName"].Value;
                // get schema
                var cols = _schemaFetcher.GetFields(
                    state._4Config.defaultConnection,
                    state._4Config.provider,
                    $"select * from {targetTable}"
                    ).Where(col => (!col.IsIdentity && !(new string[] { "text", "ntext", "image", "timestamp" }).Contains(col.TypeDb) /* && !col.IsComputed*/));
                if (matchInsert.Success)
                {
                    state._5QueryAfterScaffolding =
                        @"/* .sql query managed by QueryFirst add-in */


-- designTime - put parameter declarations and design time initialization here


-- endDesignTime
INSERT INTO " + targetTable + @" (
" + string.Join(",\r\n", cols.Select(col => col.ColumnName)) + @"
)
VALUES (
" + string.Join(",\r\n", cols.Select(col => "@" + col.ColumnName)) + @"
)";
                }
                else if (matchUpdate.Success)
                {
                    state._5QueryAfterScaffolding =
                        @"/* .sql query managed by QueryFirst add-in */


-- designTime - put parameter declarations and design time initialization here


-- endDesignTime
UPDATE " + targetTable + @"
SET 
" + string.Join(",\r\n", cols.Select(col => col.ColumnName + " = @" + col.ColumnName));
                }
            }
            else
            {
                state._5QueryAfterScaffolding = state._3InitialQueryText;
            }
            return(state);
        }