Tente usar uma consulta parametrizada aqui está um link http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/
Além disso, não use OpenQuery... use this para executar o select
SELECT * FROM db...table WHERE ref = @ref AND bookno = @bookno
Mais artigos descrevendo algumas de suas opções:
http://support.microsoft.com/kb/314520
Qual é a sintaxe do T-SQL para se conectar a outro SQL Server?
Editado
Observação:sua pergunta original era sobre consultas distribuídas e servidores vinculados. Essa nova instrução não faz referência a uma consulta distribuída. Só posso supor que você esteja se conectando diretamente ao banco de dados agora. Aqui está um exemplo que deve funcionar. Aqui está outro site de referência 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:
Ok Jamie taylor vou tentar responder sua pergunta novamente.
Você está usando OpenQuery porque provavelmente está usando um banco de dados vinculado
Basicamente o problema é que o Método OpenQuery pega uma string que você não pode passar uma variável como parte da string que você enviou para o OpenQuery.
Você pode formatar sua consulta assim. A notação segue servername.databasename.schemaname.tablename. Se você estiver usando um servidor vinculado via odbc, omita databasename e schemaname, conforme ilustrado abaixo
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