Estoy tratando de escribir una función en un controlador MVC C# al que puedo pasar el nombre de la tabla, el nombre del servidor, el nombre de la base de datos, el nombre de usuario y la contraseña. Esta función se llama desde una llamada Ajax, por lo que debe devolver JSON. Estoy acostumbrado a usar el marco de entidad, por lo que soy algo nuevo en esto: he estado tratando de usar SqlDataReader y luego coloco automáticamente todos los datos devueltos en una lista de objetos, que luego puedo devolver a Ajax, pero ni siquiera me estoy acercando: todos los métodos que usan SqlDataReader parecen requerir saber qué filas desea seleccionar de antemano, por lo que no tengo idea real de qué hacer o intentar a continuación. ¿Alguien tiene algún consejo sobre cómo lograr esto?
Básicamente, es para un proyecto que me encargaron en el que alguien puede completar un formulario con la cadena de conexión y la consulta sql, y los scripts irán al controlador y devolverán los datos. Luego, el usuario puede elegir qué columna (s) quiere usar, usando dc.js, crearé cualquier gráfico que elija en función de las columnas que elija, según los datos devueltos. Me está derritiendo la cabeza...
Esto es algo que tengo en un proyecto:
/// <summary> /// Get all of the SQL data from "tableName" using "connectionString" /// </summary> public static DataTable GetSqlDataAsDataTable(string tableName, string connectionString) { using (SqlConnection connection = new SqlConnection(connectionString)) { using (SqlCommand cmd = new SqlCommand(string.Format("SELECT * FROM [{0}]", tableName), connection)) { cmd.CommandType = CommandType.Text; using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) { using (DataTable dt = new DataTable()) { try { sda.Fill(dt); } catch (Exception) { // handle it } return dt; } } } } }
Una vez que tenga eso, puede convertir el DT a JSON como se describe en esta otra respuesta: https://stackoverflow.com/a/17398078/4842817
public static string GetJSON(string connectionString, string tableName) { try { SqlConnection connection = new SqlConnection(connectionString); connection.Open(); SqlCommand command = new SqlCommand($"SELECT * FROM {tableName}", connection); SqlDataAdapter adapter = new SqlDataAdapter(command); DataTable dataTable = new DataTable(); adapter.Fill(dataTable); connection.Close(); string json = Newtonsoft.Json.JsonConvert.SerializeObject(dataTable.Rows); return json; } catch { return string.Empty; } }
El código anterior requiere referencias a System.Data
y System.Data.SqlClient
, así como al paquete Nuget de código abierto llamado Newtonsoft.Json
.
Abrirá una conexión basada en la cadena de conexión proporcionada, seleccionará todas las columnas de la tabla especificada y completará un objeto DataTable
con esta información.
El método JsonConvert.SerializeObject(object)
de Newtonsoft.Json serializará DataRowCollection
( dataTable.Rows
) en una cadena JSON que se devolverá.
Usaría Dapper y Newtonsoft.Json de nuget y lo haría así:
public string GetTableContentsAsJson(string serverName, string databaseName, string userName, string password, string tableName) { System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder(); builder["Data Source"] = serverName; builder["integrated Security"] = false; builder["Initial Catalog"] = databaseName; builder["User ID"] = userName; builder["Password"] = password; Console.WriteLine(builder.ConnectionString); using (var connection = new SqlConnection(builder.ConnectionString)) { connection.Open(); var images = connection.Query($"SELECT * FROM {tableName}"); string s = JsonConvert.SerializeObject(images); return s; } }