Question

I am getting following error when calling a stored procedure in SQL Server from C#:

Line 1: Incorrect syntax near 'spGet_Data'.

Here is my code:

public string GetData (string destinationFile)
{
    string conectionString = "uid=One_User;pwd=One_Password;database=One_Database;server=One_Server";

    SqlConnection con = new SqlConnection(conectionString);
    SqlCommand sqlCmd = new SqlCommand();

    string returnValue = string.Empty;
    string procedureName = "spGet_Data";

    sqlCmd.CommandType = CommandType.StoredProcedure;
    sqlCmd = new SqlCommand(procedureName, con);

    sqlCmd.Parameters.AddWithValue("@FileName", destinationFile);
    con.Open();
    var returnParameter = sqlCmd.Parameters.Add("@ret", SqlDbType.VarChar);
    returnParameter.Direction = ParameterDirection.ReturnValue;

    sqlCmd.ExecuteNonQuery();
    returnValue = returnParameter.Value.ToString();

    con.Close();
    return returnValue;
}

Procedure itself returning data properly, I checked connection it is in Open state.

What else it can be?

Thank you.

Was it helpful?

Solution 2

You create a SqlCommand object, then set it's CommandType property, then overwrite it by calling new on your command object again. Written out correctly, your code should look like this:

public string GetData (string destinationFile)
{
   string conectionString = "uid=One_User;pwd=One_Password;database=One_Database;server=One_Server";
   SqlConnection con = new SqlConnection(connectionString);
   SqlCommand sqlCmd = new SqlCommand(procedureName, con); 
   sqlCmd.CommandType = CommandType.StoredProcedure;  
   string returnValue = string.Empty;
   string procedureName = "spGet_Data";

   sqlCmd.Parameters.AddWithValue("@FileName", destinationFile);
   con.Open();
   var returnParameter = sqlCmd.Parameters.Add("@ret", SqlDbType.VarChar);
   returnParameter.Direction = ParameterDirection.ReturnValue;

   sqlCmd.ExecuteNonQuery();
   returnValue = returnParameter.Value.ToString();

   con.Close();
   return returnValue;
}

Also, I would highly suggest that you surround your SqlConnection and SqlCommand objects with the Using Statement. Much like this:

public string GetData (string destinationFile)
{
   using (SqlConnection con = new SqlConnection(connectionString))
   {
      using (SqlCommand sqlCmd = new SqlCommand(procedureName, con))
      {
      }
   } 
}    

The benefit of doing it this way is cleaner code and since your command and connection objects implement IDisposable, they will be handled by GC once they fall out of scope.

By the way, you have 'conectionString' misspelled; I fixed it in my code examples.

OTHER TIPS

The problem lies in the fact that you create the command two times.
After the first initialization you set correctly the CommandType to StoredProcedure, but once again you created the command and this time you forgot to set the CommandType

Just remove the first initialization, leave only the second one and move the CommandType setting after the initialization

SqlConnection con = new SqlConnection(conectionString);
string returnValue = string.Empty;
string procedureName = "spGet_Data";
SqlCommand sqlCmd = new SqlCommand(procedureName, con);
sqlCmd.CommandType = CommandType.StoredProcedure;

Whoops. This is being done, albeit incorrectly. See the other answer.


See SqlCommand.CommandType. You need to tell it to be treated as an sproc call. E.g.

sqlCmd.CommandType = CommandType.StoredProcedure;

Otherwise it results in an invalid SQL statement (i.e. running spGet_Data verbatim in an SSMS query should produce a similar messages).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top