2009-03-29 13 views
12

Mi aplicación Windows Forms utiliza un conjunto de datos fuertemente tipado creado con el diseñador en Visual Studio. En tiempo de ejecución, me gustaría poder seleccionar la base de datos en vivo o de prueba.¿La mejor manera de establecer una cadena de conexión de conjunto de datos fuertemente tipada en el tiempo de ejecución?

¿Cuál es la mejor manera de establecer programáticamente la cadena de conexión para el conjunto de datos en tiempo de ejecución?

+0

A partir de VS2010 la visibilidad de la conexión puede ser s pecificado (p. public) y se puede especificar una Clase base para los DataTableAdapters generados ... (es decir, esta publicación está relacionada principalmente con VS2008 y problemas anteriores :-) –

Respuesta

1

Almacene cadenas de conexión para ambos en un app.config y luego puede cambiar en función de un interruptor de línea de comando/inicio. O si desea darle al usuario la flexibilidad, puede darles una página de opciones donde puedan seleccionar qué conexión usar.

A continuación se muestra el código para leer un interruptor de puesta en marcha:

string[] args = Environment.GetCommandLineArgs(); 
// The first (0 index) commandline argument is the exe path. 
if (args.Length > 1) 
{ 
    if (Array.IndexOf(args, "/live") != -1) 
    { 
     // connection string = 
     // ConfigurationSettings.AppSettings["LiveConString"]; 
    } 
} 
else 
{ 
    // connection string = 
    // ConfigurationSettings.AppSettings["TestConString"]; 
} 

Así que ahora que inicie su aplicación llamando al:

MyApp.exe /live 

Usando solo MyApp.exe o con cualquier otro interruptor se obtener la configuración de prueba.

+0

Gracias por su respuesta, pero mi pregunta es ¿cómo puede establecer la cadena de conexión de un conjunto de datos fuertemente tipado en tiempo de ejecución. – wethercotes

1

Re: wethercotes comentan

Las asistente almacena la cadena de conexión cuando se configura el conjunto de datos, pero eso no quiere decir que no se puede hacer más dinámico. Depende de la versión que esté usando, pero en general si expande los archivos en su conjunto de datos, encontrará un archivo como Designer.cs o DataTableNameAdapter.xsd. Puede abrir esos archivos y buscar _connection. Esta suele ser una variable privada y se establece en una función init en la clase.

Puede hacer que la dinámica de la configuración mediante la adición de un código como el siguiente:

public string ConnectionString 
{ 
    get { return this._connection.ConnectionString; } 
    set 
    { 
     if (this._connection == null) 
     { 
      this._connection = new System.Data.SqlClient.SqlConnection(); 
     } 
     this._connection.ConnectionString = value; 
    } 
} 

Tenga en cuenta que si vuelve a generar el conjunto de datos es probable que perder esta sección de código, y sin refactorización el conjunto de datos es posible que tenga que añadir a varios objetos.

+0

Gracias de nuevo Gary. Creé una clase parcial con su código, que detiene su pérdida cuando se regenera el conjunto de datos. Lamentablemente, esto tiene que hacerse para cada adaptador de datos, que tengo docenas. – wethercotes

0

mejor solución que he encontrado hasta el momento:

Añadir otra configuración del programa que mantiene la cadena de conexión preffered según lo establecido por el cliente en tiempo de ejecución (por ejemplo newConnectionString.)

entonces antes mediante el adaptador de la Tabla:

this.myTableAdapter.Connection.ConnectionString = Properties.Settings.Default.newConnectionString; 
+0

No, no puedes hacerlo de esta manera. La propiedad de conexión en TableAdapters se define como interna. –

+0

Funciona sin problemas para mi proyecto ... – yimbot

3

propiedad Connection en TableAdapters se define como interna.

internal global::System.Data.SqlClient.SqlConnection Connection 

lo tanto, en caso de que su TypedDataset no está en la misma Asamblea que sus ventanas principales formas aplicación, usted no será capaz de acceso a la propiedad de conexión. Este problema puede aparecer más adelante cuando refactorice el código de su conjunto de datos y muévalo en un proyecto separado que producirá su propio ensamblaje independiente.

Para resolver este problema, puede hacer lo que se menciona a continuación.

crear una clase parcial para su TableAdapter y agregar otro constructor al lado del constructor público sin parámetros predeterminado. Suponiendo tipo TableAdapter como MyTableAdapter

public partial class MyTableAdapter 
{ 
    public MyTableAdapter(SqlConnection connection) 
    { 
     thisSetConnection(connection); 
     this.ClearBeforeFill = true; 
    } 

    public void SetConnection(SqlConnection connection) 
    { 
     this._connection = connection; 
    } 
} 

Tendrá que hacer esto para todos los que TableAdapters que tiene en su proyecto. TableAdapter no tiene ninguna clase base común, pero gracias a que se declaran como clases parciales, podemos hacerlo del modo mencionado anteriormente.

Ahora en tiempo de ejecución, puede crear una instancia de su TableAdapter como esto ..

SqlConnection connection; 
//create the connection here at runtime.. 
MyTableAdapter adapter = new MyTableAdapter(connection); 

o puede ser incluso asignar más tarde después de crear la instancia con TableAdapter sin parámetros por defecto constructor público ..

SqlConnection connection; 
//create the connection here at runtime.. 
MyTableAdapter adapter = new MyTableAdapter(); 
adapter.(connection); 
0

Es un dolor para editar el archivo de diseñador.

creé una entrada de configuración en "Usuario 'llamado 'ConnectionString', lo que hace que Visual Studio crea una cadena de aplicaciones 'Conexión Cadena1' cuando se agrega un establecimiento inflexible conjunto de datos.

Por lo tanto, basta con sustituir todos' ConnectionString1 'con' ConnectionString 'en el archivo del diseñador de datos, y que le permitirá usar una cadena de' Usuario 'para cargar su cadena de conexión en tiempo de ejecución.

En mi humilde opinión, es una falla que permite a los usuarios modificar cadenas de conexión en tiempo de ejecución. (¿Alguien está escuchando en Redmond?)

Cuestiones relacionadas