ERRO CONVERSÃO ESPECIFICADA NÃO É V?LIDA.

SEPULTURA 12/08/2014 09:55:49
#440359
Olá , amigos . estou a salvar uma foto do SQLSERVER campo Image para Arquivo na Raiz do Sistema mais obtenho o erro

Erro Conversão especificada não é válida.
E aponta para essa linha clie_nom1 = mReader.GetInt32(0).ToString();

Tentei conversão (Byte) ... Int16 .... Strings ... Rows .... tudo que imaginarem , e esse trecho não vai
Alguem poderia ajudar


        private void butImage_Click(object sender, EventArgs e)
{

if (txtClie_nom.Text.Equals([Ô][Ô]))
{
MessageBox.Show([Ô]Informe o Código[Ô]);
return;
}
else
{
getFotoArq(txtClie_nom.Text);
}

barraStatus.Text = [Ô]Arquivo Salvo no sistema[Ô];
}

// **** Le o BLOB a partir do banco de dados e salva no sistema de arquivos
public void getFotoArq(string cod)
{
SqlCommand getF = new SqlCommand([Ô]select clie_foto from Cadclie where Clie_cod= ([ô][Ô] + cboClie_cod.Text + [Ô][ô]) and Clie_empr = ([ô][Ô] + txtClie_empr.Text + [Ô][ô])[Ô], con);
getF.Parameters.Add([Ô]@CLIE_COD[Ô], SqlDbType.SmallInt).Value = Convert.ToInt16(cboClie_cod.Text);
getF.Parameters.Add([Ô]@CLIE_EMPR[Ô], SqlDbType.SmallInt).Value = Convert.ToInt16(txtClie_empr.Text);
FileStream fs; // Escreve o BLOB para o arquivo (*.bmp).
BinaryWriter bw; // Define um Streams para o objeto
int tamanhoBuffer = 100; // Tamanho do buffer do BLOB
byte[] byteSaida = new byte[tamanhoBuffer]; // o buffer BLOB byte[] para ser preenchido com GetBytes.
long retorno; // Os bytes retornados de GetBytes.
long inicioIndice = 0; // A posicao inicial no BLOB de saida
string clie_nom1 = [Ô][Ô]; // O codigo do funcionario em uso no arquivo

// Abre a conexão e le os dados no DataReader.
con.Open();
SqlDataReader mReader = getF.ExecuteReader(CommandBehavior.SingleRow);
while (mReader.Read())
{
clie_nom1 = mReader.GetInt32(0).ToString();

// Cria o arquivo para tratar a saida dos dados
fs = new FileStream([Ô]Cliente [Ô] + clie_nom1 + [Ô].jpg[Ô], FileMode.OpenOrCreate, FileAccess.Write);
bw = new BinaryWriter(fs);

// Reseta o byte de inicio para o novo BLOB.
inicioIndice = 0;

// Le os bytes no byteSaida[] e retem o numero de bytes retornados
retorno = mReader.GetBytes(1, inicioIndice, byteSaida, 0, tamanhoBuffer);

// Continua lendo e escrevendo enquanto existir bytes ate completar o tamanho do buffer
while (retorno == tamanhoBuffer)
{
bw.Write(byteSaida);
bw.Flush();

//Reposiciona o inidice de inicio para o fim ultimo buffer e preenche o buffer
inicioIndice += tamanhoBuffer;
retorno = mReader.GetBytes(1, inicioIndice, byteSaida, 0, tamanhoBuffer);
}

// Escreve o restante do buffer
bw.Write(byteSaida, 0, (int)retorno);
bw.Flush();

// fecha o arquivo de saida
bw.Close();
fs.Close();
}

// fecha o datareader e a conexao
mReader.Close();
con.Close();
}
JABA 16/08/2014 14:53:01
#440489
Tenta assim pra ver se vai:

clie_nom1 = mReader[0].ToString();

ou assim:

clie_nom1 = (string) mReader[0];

Você tem certeza de que esse indice zero no MReader é referente ao campo nome no banco de dados mesmo?
FILMAN 16/08/2014 18:17:27
#440493
Utiliza essa função para gravar a imagem na pasta!
Como você sempre vai ter uma imagem por vez crie um único nome!

//Declaração fora do While
byte[] byteSaida = null;

//Dentro do While
byteSaida = mReader[[Ô]CAMPOFOTO[Ô]] as byte[];

if (byteSaida != null)
GetImage(byteSaida);


//Metodo VOID somente para carregar o Picture Caso tenha imagem grava no banco
public void GetImage(byte[] Logo)
{
MemoryStream stream = new MemoryStream(Logo);
System.Drawing.Image img = System.Drawing.Image.FromStream(stream);
string strPath = Application.StartupPath([Ô]assinatura.jpg[Ô]);
img.Save(strPath);
PictureBox1.Image = New Bitmap(strPath);
PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
}


Espero ter ajudado
Faça seu login para responder