private static string GetTableName(VfpModificationCommandTree modificationCommandTree) { var formatter = new DmlSqlFormatter(); modificationCommandTree.Target.Expression.Accept(formatter); return(formatter.ToString().Trim()); }
private static void GenerateReturningSql(VfpProviderManifest vfpManifest, VfpModificationCommandTree commandTree, DmlSqlFormatter formatter, VfpExpression returning) { if (returning == null) { return; } formatter.WriteLine(Indentation.Same); formatter.Write(VfpCommand.SplitCommandsToken); formatter.WriteLine(Indentation.Same); // select formatter.Write("SELECT "); returning.Accept(formatter); formatter.WriteLine(Indentation.Same); // from formatter.Write("FROM "); commandTree.Target.Expression.Accept(formatter); formatter.WriteLine(Indentation.Same); // where formatter.Write("WHERE "); var table = ((VfpScanExpression)commandTree.Target.Expression).Target; var identity = false; var first = true; foreach (var keyMember in table.ElementType.KeyMembers) { if (first) { first = false; } else { formatter.Write(" and "); } formatter.Write(keyMember); // retrieve member value sql. the translator remembers member values // as it constructs the DML statement (which precedes the "returning" // SQL) DbParameter value; if (formatter.memberValues.TryGetValue(keyMember, out value)) { formatter.Write(" = "); formatter.Write(value.ParameterName); } else { if (identity) { throw new NotSupportedException(string.Format("Server generated keys are only supported for identity columns. More than one key column is marked as server generated in table '{0}'.", table.Name)); } formatter.Write(" = "); formatter.Write(VfpCommand.ExecuteScalarBeginDelimiter); formatter.Write("="); formatter.Write(GetTableName(commandTree)); formatter.Write("."); formatter.Write(keyMember.Name); formatter.Write(VfpCommand.ExecuteScalarEndDelimiter); formatter.Write(" "); identity = true; } } }