Estoy seguro de que esta pregunta ya ha sido respondida, sin embargo, no pude encontrar una respuesta usando la herramienta de búsqueda.
Usando c # me gustaría ejecutar un archivo .sql. El archivo sql contiene varias declaraciones sql, algunas de las cuales están divididas en varias líneas. Intenté leer el archivo e intenté ejecutar el archivo usando ODP.NET ... sin embargo, no creo que ExecuteNonQuery esté realmente diseñado para hacer esto.
Así que intenté usar sqlplus para generar un proceso ... sin embargo, a menos que haya generado el proceso con UseShellExecute establecido en verdadero, sqlplus se colgaría y nunca saldría. Aquí está el código que NO FUNCIONA.
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "sqlplus";
p.StartInfo.Arguments = string.Format("xx/xx@{0} @{1}", in_database, s);
p.StartInfo.CreateNoWindow = true;
bool started = p.Start();
p.WaitForExit();
WaitForExit nunca regresa ... A menos que establezca UseShellExecute en verdadero. Un efecto secundario de UseShellExecute es que no puede capturar la salida redirigida.
Respuestas:
fuente
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup>
Probé esta solución con Microsoft.SqlServer.Management pero no funcionó bien con .NET 4.0, así que escribí otra solución usando solo .NET libs framework.
fuente
Esto funciona en Framework 4.0 o superior. Soporta "IR". También muestre el mensaje de error, la línea y el comando sql.
fuente
connection.Close()
la conexión se cerrará por lausing
que ha envolvió en.Ponga el comando para ejecutar el script sql en un archivo por lotes y luego ejecute el siguiente código
en el archivo por lotes escriba algo como esto (muestra para el servidor sql)
fuente
Esto funciona para mi:
fuente
Se agregaron mejoras adicionales a la respuesta de surajits:
Además, tuve que agregar las siguientes referencias a mi proyecto:
C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll
C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll
No tengo idea de si esos son los dll: s adecuados para usar, ya que hay varias carpetas en C: \ Archivos de programa \ Microsoft SQL Server, pero en mi aplicación estos dos funcionan.
fuente
Logré encontrar la respuesta leyendo el manual :)
Este extracto del MSDN
Convierte el código en esto;
Que ahora sale correctamente.
fuente
p.StandardOutput.ReadToEnd();
nunca saleHay dos puntos a considerar.
1) Este código fuente funcionó para mí:
Configuré el directorio de trabajo en el directorio del script, para que los subguiones dentro del script también funcionen.
Llámalo, por ejemplo, como
Execute("usr/pwd@service", "c:\myscripts", "script.sql")
2) Tienes que finalizar tu script SQL con la declaración
EXIT;
fuente
Usando EntityFramework, puede ir con una solución como esta. Yo uso este código para inicializar las pruebas e2e. Para evitar ataques de inyección sql, asegúrese de no generar este script en función de la entrada del usuario o utilizar parámetros de comando para esto (consulte la sobrecarga de ExecuteSqlCommand que acepta parámetros).
fuente
No pude encontrar ninguna forma exacta y válida de hacer esto. Entonces, después de todo un día, llegué con este código mixto logrado de diferentes fuentes y tratando de hacer el trabajo.
Pero todavía está generando una excepción
ExecuteNonQuery: CommandText property has not been Initialized
a pesar de que ejecuta con éxito el archivo de script; en mi caso, crea con éxito la base de datos e inserta datos en el primer inicio.fuente