Intente usar una consulta parametrizada aquí hay un enlace http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/
Además, no use OpenQuery... use this para ejecutar la selección
SELECT * FROM db...table WHERE ref = @ref AND bookno = @bookno
Más artículos que describen algunas de sus opciones:
http://support.microsoft.com/kb/314520
¿Cuál es la sintaxis de T-SQL para conectarse a otro servidor SQL?
Editado
Nota:Su pregunta original se refería a consultas distribuidas y servidores vinculados. Esta nueva declaración no hace referencia a una consulta distribuida. Solo puedo suponer que ahora se está conectando directamente a la base de datos. Aquí hay un ejemplo que debería funcionar. Aquí hay otro sitio de referencia para usar SqlCommand.Parameters
SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con);
cmd.Parameters.Add("@ref", SqlDbType.Int);
cmd.Parameters["@ref"] = 34;
Editado:
Vale, Jamie Taylor, intentaré responder a tu pregunta de nuevo.
Está utilizando OpenQuery porque probablemente esté utilizando una base de datos vinculada
Básicamente, el problema es que el Método OpenQuery toma una cadena que no puede pasar una variable como parte de la cadena que envió a OpenQuery.
En su lugar, puede formatear su consulta de esta manera. La notación sigue a servername.databasename.schemanname.tablename. Si está utilizando un servidor vinculado a través de odbc, omita el nombre de la base de datos y el nombre del esquema, como se ilustra a continuación
Dim conn As SqlConnection = New SqlConnection("your SQL Connection String")
Dim cmd As SqlCommand = conn.CreateCommand()
cmd.CommandText = "Select * db...table where investor = @investor"
Dim parameter As SqlParameter = cmd.CreateParameter()
parameter.DbType = SqlDbType.Int
parameter.ParameterName = "@investor"
parameter.Direction = ParameterDirection.Input
parameter.Value = 34