Set FMTONLY on

15/02/2008 - 16:31 por Jose Guzman | Informe spam
Hola todos.

Me surgio esta duda leyendo otros mensajes en este y otros foros.

En el profiler de SQL se ve que FillSchema(), instruccion que se usa para
cargar el esquema de una tabla envuelve la instruccion select con el comando
Set FMTONLY ON... OFF.

La inquietud es saber como ADO.NET construye el esquema ya que lo que uno ve
en el resultado es lo mismo que si no se usara FMTONLY, salvo que no trae
registros.

He buscado en la documentacion tanto de .NET como de SQL Server y no
encuentro nada.

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
15/02/2008 - 16:53 | Informe spam
"Jose Guzman" wrote in message
news:%23NGQUf%
Me surgio esta duda leyendo otros mensajes en este y otros foros.

En el profiler de SQL se ve que FillSchema(), instruccion que se usa para
cargar el esquema de una tabla envuelve la instruccion select con el
comando Set FMTONLY ON... OFF.

La inquietud es saber como ADO.NET construye el esquema ya que lo que uno
ve en el resultado es lo mismo que si no se usara FMTONLY, salvo que no
trae registros.



Enviando un Select dentro de un SET FMTONLY ON lo que se consigue es que
el servidor envíe solo la descripción de las columnas, sin enviar ningún
registro. Precísamente esa descripción de las columnas es la información que
se necesita para construir el esquema. Nota: esta descripción (tipo, tamaño,
etc.) no se ve en pantalla cuando ejecutas la sentencia desde el analizador
de consultas, pero viene dentro de la información transmitida al SqlClient.
Respuesta Responder a este mensaje
#2 Jose Guzman
15/02/2008 - 21:05 | Informe spam
Hola Alberto.

Otra pregunta, si yo mando directamente el select escribiendo yo el comando
ej:

new sqlcommand("set fmtonly on; select * from facturas ; select fmtonly
off", conn)

Como yo saco la estructura para leerla en mi programa?


"Alberto Poblacion"
escribió en el mensaje news:%23jx5lr%
"Jose Guzman" wrote in message
news:%23NGQUf%
Me surgio esta duda leyendo otros mensajes en este y otros foros.

En el profiler de SQL se ve que FillSchema(), instruccion que se usa para
cargar el esquema de una tabla envuelve la instruccion select con el
comando Set FMTONLY ON... OFF.

La inquietud es saber como ADO.NET construye el esquema ya que lo que uno
ve en el resultado es lo mismo que si no se usara FMTONLY, salvo que no
trae registros.



Enviando un Select dentro de un SET FMTONLY ON lo que se consigue es que
el servidor envíe solo la descripción de las columnas, sin enviar ningún
registro. Precísamente esa descripción de las columnas es la información
que se necesita para construir el esquema. Nota: esta descripción (tipo,
tamaño, etc.) no se ve en pantalla cuando ejecutas la sentencia desde el
analizador de consultas, pero viene dentro de la información transmitida
al SqlClient.

Respuesta Responder a este mensaje
#3 Alberto Poblacion
16/02/2008 - 12:22 | Informe spam
"Jose Guzman" wrote in message
news:%
Otra pregunta, si yo mando directamente el select escribiendo yo el
comando ej:

new sqlcommand("set fmtonly on; select * from facturas ; select fmtonly
off", conn)

Como yo saco la estructura para leerla en mi programa?



No lo he probado, pero me imagino que podrás hacer un ExecuteReader de
ese SqlCommand, que no te devolverá ningún registro, pero sí que te
rellenará las características de las columnas del DataReader (por ejemplo,
FieldCount te dará el número de columnas, GetFieldType(n) el tipo de la
columna n, etc.)
Respuesta Responder a este mensaje
#4 Jesús López
16/02/2008 - 12:51 | Informe spam
Lo podrías hacer así:

IDataReader reader = cmd.ExecuteReader(CommandBehavior.KeyInfo)
DataTable schema = reader.GetSchemaTable()

El método GetShemaTable devuelve un datatable con los metadatos del
datareader. Este datatable contiene una fila por cada campo.

http://msdn2.microsoft.com/en-us/li...chematable(VS.85).aspx

Sin embargo, no es necesario incluir SET FMTONLY ON en la sentencia SELECT,
ya que a ExecuteReader se le puede especificar CommandBehavior.SchemaOnly en
cuyo caso SqlClient ya se encarga de envolver la sentencia entre SET FMTONLY
ON y SET FMTONLY OFF.

La forma en la que yo obtendría el esquema sería la siguiente:

public static DataTable GetShemaTable(string query)
{
using (SqlConnection cn = CreateConnection())
using (SqlCommand cmd = new SqlCommand(query, cn))
{
cn.Open();
using (SqlDataReader reader = cmd.ExecuteReader(
CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly))
{
return reader.GetSchemaTable();
}
}
}


public static void ShowFacturasMetadata()
{
DataTable schema = GetSchemaTable("SELECT * FROM Facturas");
ShowDataTable(schema);
}



"Jose Guzman" escribió en el mensaje
news:%
Hola Alberto.

Otra pregunta, si yo mando directamente el select escribiendo yo el
comando ej:

new sqlcommand("set fmtonly on; select * from facturas ; select fmtonly
off", conn)

Como yo saco la estructura para leerla en mi programa?


"Alberto Poblacion"
escribió en el mensaje news:%23jx5lr%
"Jose Guzman" wrote in message
news:%23NGQUf%
Me surgio esta duda leyendo otros mensajes en este y otros foros.

En el profiler de SQL se ve que FillSchema(), instruccion que se usa
para cargar el esquema de una tabla envuelve la instruccion select con
el comando Set FMTONLY ON... OFF.

La inquietud es saber como ADO.NET construye el esquema ya que lo que
uno ve en el resultado es lo mismo que si no se usara FMTONLY, salvo que
no trae registros.



Enviando un Select dentro de un SET FMTONLY ON lo que se consigue es
que el servidor envíe solo la descripción de las columnas, sin enviar
ningún registro. Precísamente esa descripción de las columnas es la
información que se necesita para construir el esquema. Nota: esta
descripción (tipo, tamaño, etc.) no se ve en pantalla cuando ejecutas la
sentencia desde el analizador de consultas, pero viene dentro de la
información transmitida al SqlClient.





email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida